4

我的问题与制作空字符串常量是否值得?.

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

public final static int ZERO = 0;

用作通用常量并像在代码库中一样继续重用它Constants.ZERO,还是更好地使用字面值 0?

通用布尔值呢?IE

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

8 回答 8

7

对于您定义的常量,没有理由使用它们,因为没有额外的含义。字面量0,truefalse已经有了它们的含义。

如果对这些值附加一些额外的含义,那么常量将是值得创建的,例如:

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

这些值背后是有意义的,它们可能会改变:

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

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

如果这些值具有超出其字面值的含义,并且它们可以更改,那么创建常量是值得的。

于 2013-10-24T00:11:45.837 回答
2

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

为您提到的常量(0,1,true,false 等)提供名称已经有其意义。将常数 0 命名为零实际上并没有增加任何内容。将空字符串命名为“”有一个很小的价值,因为您提供了一些额外的含义——不仅仅是文字是“”,而是您的意思是说 EmptyString。

许多系统将数值定义为有意义,例如 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

因为使用这些名称可以清楚地说明开发人员的意图。

于 2013-10-24T00:36:22.363 回答
1

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

无论哪种方式,HotSpot VM 都可能将您的代码编译为相同的机器代码。

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

于 2013-10-24T00:12:45.077 回答
1

给常量 0 指定一个上下文特定的名称(如 )比简单的零更有用,NUM_EXCEPTIONS_TO_TOLERATE因为它不会传达太多信息。

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

如果您担心空间,我会认为它过早的优化太多了。

于 2013-10-24T00:13:03.297 回答
1

布尔常量已经存在Boolean.TRUE并且Boolean.FALSE.

我只使用这样的常量,如果它是一个幻数,在代码中硬编码它并不明显。

private static final int SECS_PER_DAY = 86400;

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

于 2013-10-24T00:13:12.950 回答
0

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

于 2013-10-24T00:11:49.110 回答
0

使用这样的常量来避免“幻数”乱扔你的代码。也就是说,代码可读性为王,所以 SOME_SIGNIFICANT_NUMBER 比明显随机的 33、57、98 或其他任何值要好。

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

于 2013-10-24T00:12:24.357 回答
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);
于 2013-10-24T00:59:39.247 回答