以下哪个代码更好,为什么?我看过很多以第一种方式编写的程序如下所示.为什么这样做?
第一种方式:
public static final int SIZE = 200000;
public static int[] count;
public static void main(String[] args) {
count = new int[SIZE];
}
Run Code Online (Sandbox Code Playgroud)
第二种方式:
public static int[] count;
public static void main(String[] args) {
count = new int[200000];
}
Run Code Online (Sandbox Code Playgroud)
200000是一个神奇的数字.我们不知道它来自哪个环境,它在那里做了什么,或者它意味着什么 - 如果一个人不得不把它改成别的东西,它就会感觉像是一个随意的变化.它甚至可能破坏测试,业务规则假设或者花费公司资金.
创建一个封装其目的的常量可以给出幻数含义和上下文.我们现在知道它与SIZE有关,如果我们改变它,我们将增加或减少数组的SIZE.
要点:SIZE不是最好的名字,如果你只是在一个地方使用它(即在数组的初始化中),评论或一些轻量级的文档会尽可能多地阐明为什么数组的大小设置如此任意高的命名常数.
将常量提取到静态最终字段有两个好处:
首先,它有一个名称 - 诚然SIZE不是一个很好的名称(大小是什么?为什么?)但在其他情况下,使你的意图明确是非常有用的.例如,这显然意味着什么:
private static final long SECONDS_PER_STANDARD_DAY = 24 * 60 * 60;
Run Code Online (Sandbox Code Playgroud)
(虽然我通常TimeUnit在这里使用).在代码中具有相同的值 - 或者更糟糕的是,实际的数值而不是表达式 - 将不那么清楚.当然可以进一步细分以上内容:
// TODO: Decide between long and int here. Using long means you don't need to be
// as careful when multiplying them together. (Think microseconds etc...)
private static final long HOURS_PER_STANDARD_DAY = 24;
private static final long MINUTES_PER_HOUR = 60;
private static final long SECONDS_PER_MINUTE = 60;
private static final long SECONDS_PER_HOUR = SECONDS_PER_MINUTE * SECONDS_PER_HOUR;
private static final long SECONDS_PER_STANDARD_DAY =
HOURS_PER_STANDARD_DAY * SECONDS_PER_HOURS;
Run Code Online (Sandbox Code Playgroud)
这正是我在Noda Time中所拥有的那种东西- 我有一个NodaConstants
包含大量这些常量的公共类,因为它们在Noda Time和客户端代码中都很有用 - 而且这个名字的含义很明显.
此外,它可以在多个地方使用,显示这些地方之间的关系.如果在源代码中出现三次相同的数字,并且您需要更改其中一个,是否需要更改另一个?这很难说.如果您使用的是恒定的,如果每一个地方需要的数位认真决定是否语义他们所需要的相同的值,那么你就可以改变常数和所有适当的地方(也是唯一正确的地方)的价值会看到更改.
一些开发人员将此视为极端,禁止除零和一个以外的所有文字.我个人认为这是一个比这更微妙的决定.提取常量和利益是有代价的 - 使用它从代码中移除值.如果您只使用该值一次,并且从上下文中可以清楚地看到为什么使用该值,那么使用常量会使代码变得模糊而不是澄清它.
我认为总是值得考虑是否提取一个常数 - 但不要以一种下意识的方式走向任何一种方式.
| 归档时间: |
|
| 查看次数: |
151 次 |
| 最近记录: |