我的问题与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;
答案 0 :(得分:5)
对于你定义的常数,没有理由,因为没有额外的意义。文字0
,true
和false
已经有了它们的含义。
如果附加到这些值有一些额外的含义,常量值得创建,例如:
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.TRUE
和Boolean.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);