是否值得在Java中保留原语的常量?

时间:2013-10-24 00:08:32

标签: java primitive

我的问题与Is making an empty string constant worth it?有关。

我知道常量应该有有意义的名称,但是在Constants文件中提取像Java中的int这样的原始值有什么好处:

public final static int ZERO = 0;

用作通用常量并继续在代码库中重用Constants.ZERO或更好地使用0的字面值?

通用布尔值怎么样?即

public static final boolean TRUE = true;
public static final boolean FALSE = false;

8 个答案:

答案 0 :(得分:5)

对于你定义的常数,没有理由,因为没有额外的意义。文字0truefalse已经有了它们的含义。

如果附加到这些值有一些额外的含义,常量值得创建,例如:

public static final int SUCCESS = 0;
public static final boolean DEBUG = true;

这些价​​值观背后有意义,它们可能会发生变化:

public static final int SUCCESS = 1;
public static final boolean DEBUG = false;

这会比更改程序中的大量文字更容易更改值。

如果这些值的含义超出了它们的字面值,并且它们可以改变,那么创建常量值得付出努力。

答案 1 :(得分:1)

如果它使您的程序更容易理解或维护,是的。否则,没有。

HotSpot VM可能会将您的代码符合相同的机器代码。

顺便说一句,Boolean.TRUE和Boolean.FALSE已经存在。

答案 2 :(得分:1)

将常量0的特定于上下文的名称(如NUM_EXCEPTIONS_TO_TOLERATE)比简单的ZERO更有用,因为它不会传达太多。

至于布尔值,变量名称会传达上下文,因此将它们定义为常量没有多大意义。

如果你担心太空,我会认为premature optimization太多了。

答案 3 :(得分:1)

布尔常量已存在Boolean.TRUEBoolean.FALSE

我只使用这样的常量,如果它是一个在代码中硬编码的神奇数字那么不明显。

private static final int SECS_PER_DAY = 86400;

所以ZERO本身没有多大意义。

答案 4 :(得分:1)

命名常量有两个很好的理由。最好的理由是通过命名常量(Pi,EarthDiameter,SpeedofLight,AvagadroNumber等)来澄清代码,而不是直接引用该值。另一种方法是将数量命名为常量,但可能会因更改规格而发生变化(例如:MAX_CHILD_THREADS,BtreeRadix)。但是将这些常量的定义放在一个位置,修改它们的值以满足未来的需求变得更容易。

为你提到的常数(0,1,true,false等)提供名称已经有了它们的含义。将常量0命名为零确实不会增加任何内容。命名空字符串“”有一个小值,因为你提供了一些额外的含义 - 不仅仅是文字是“”,而是你的意思是说空字符串。

许多系统定义具有含义的数值,例如Linux / Unix errno.h,为特定整数提供系统范围的含义。因此,定义有价值,例如,

public static final int SUCCESS = 0;
public static final int EPERM = 1; // Operation not permitted
public static final int ENOENT= 2; // No such file or directory
public static final int ESRCH = 3; // No such process
public static final int EINTR = 4; // Interrupted system call

因为使用这些名称可以明确开发人员的意图。

答案 5 :(得分:0)

我怀疑ZERO,FALSE或TRUE会改变它们的价值。此外,FALSE和TRUE在布尔类中定义(但不是基元)。

答案 6 :(得分:0)

使用这样的常量来避免让“魔法数字”乱丢你的代码。也就是说代码可读性是King,所以SOME_SIGNIFICANT_NUMBER优于明显随机的33,或57,或98等等。

如果你在多个地方引用它也可以更容易维护 - 即如果它们都使用相同的常量,你就不必改变100个文字。

答案 7 :(得分:0)

这一切都追溯到代码可读性。一个很好的指标 - “WTF?!?!”的数量阅读代码的人每分钟一次。

常量的使用不当 - 记录不言而喻的事情:

// yeah, that we have bigger problems if that changes...
public static final String WORLD_WIDE_WEB_PREFIX = "www";

另一个例子 - 用一个直线值代替常数的常数代替:

// to be used in exactly 1 place
private static final int RETRY_COUNT = 3;
// ...
// ... 480 lines later ...
// ...
public int getRetryCount() {
  // what's the value of this thing again?
  return RETRY_COUNT;
}

使用上一个示例,如果您计划在多个地方使用3的值,则常量更好 - 它将保证该数字的所有引用都是同步的(您将其从3更改)到5,他们都改变了)

另一方面,

// what's 143?!?! where do I go looking for what it means?!?!
complexPart.setType(143);