哪一个更可取,为什么

时间:2014-10-03 05:43:13

标签: java

以下哪个代码更好,为什么?我看过很多以第一种方式编写的程序如下所示。为什么这样做?

第一种方式:

 public static final int SIZE = 200000;
 public static int[] count;
 public static void main(String[] args) {
    count = new int[SIZE];
 }

第二种方式:

public static int[] count;
public static void main(String[] args) {
    count = new int[200000];
}

2 个答案:

答案 0 :(得分:9)

200000magic number。我们不知道它来自哪个环境,它在那里做了什么,或者它意味着什么 - 如果一个人不得不把它改成别的东西,它就会感觉像是一个随意的变化。它甚至可以破坏测试,业务规则假设,或者花费公司的资金。

创建一个封装其目的的常量可以给出幻数含义和上下文。我们现在知道它与SIZE有关,如果我们改变它,我们会增加或减少数组的SIZE。

要点:SIZE不是最好的名字,如果你只在一个地方使用它(即在数组的初始化中),评论或一些轻量级的文档会尽可能多地说明为什么数组的大小被设置为任意高的命名常数。

答案 1 :(得分:7)

将常量提取到静态最终字段有两个好处:

首先,它有一个名称 - 诚然SIZE不是很好的(大小是什么?为什么?)但在其他情况下它可能非常有用你的意图清楚了。例如,显而易见的是:

private static final long SECONDS_PER_STANDARD_DAY = 24 * 60 * 60;

(虽然我通常在这里使用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;

这正是我在Noda Time中所拥有的一种东西 - 我有一个公开NodaConstants 具有大量这些常数的类,因为它们在Noda Time和 也在客户端代码中 - 从名称中可以立即看出其含义。

此外,它可以在多个地方使用,这显示了这些地方之间的关系。如果在源代码中出现三次相同的数字,并且您需要更改其中一个,是否需要更改另一个?这很难说。如果你使用常量,并且每个需要数字的地方都仔细决定是否语义它们需要相同的值,那么你可以改变常量和所有正确位置的值(并且只有正确的地方)会看到这种变化。

一些开发人员将此视为极端,禁止除零和一个以外的所有文字。我个人认为这是一个比这更微妙的决定。提取常量和利益需要付出代价 - 使用它从代码中移除值。如果您仅使用该值一次,并且从上下文中清楚了解您使用该值的原因,则使用该常量会隐藏代码而不是澄清它。

我认为总是值得考虑是否要提取一个常数 - 但不要以一种下意识的方式前进。