14

这是来自有效的Java

使用 int 枚举模式的程序很脆弱。因为 int 枚举是编译时常量,所以它们被编译到使用它们的客户端中。

有人可以解释为什么 int 枚举模式被称为编译类型常量以及编译到客户端中的含义是什么?

这是一个这样的常数的例子:

public static final int APPLE_FUJI = 0;
4

2 回答 2

19

假设你有两个文件:

Foo.java:
public class Foo
{
    public static final int SOMETHING = 1;
}

Bar.java:
public class Bar
{
    public static void main(String[] args)
    {
        System.out.println(Foo.SOMETHING);
    }
}

编译它们,运行java Bar,它会打印出 1。

现在将 Foo.java 更改SOMETHING为 2,然后重新编译Foo.java。重新运行java Bar仍然Foo会打印 1。常量值将被复制到使用它的每一段代码中,而不是在执行时询问该值。

在实践中,如果您在任何时间发生任何变化时重新编译所有内容,这不是问题。

于 2012-08-02T08:13:31.500 回答
6

值“0”本身将.class在编译期间内置到文件中。如果您随后更改该值,则必须重新编译使用它的所有内容,包括使用您的应用程序/库的任何客户端代码。

如果不这样做,您将不会收到警告,而是会收到不正确的行为。

如果您的编译时常量仅在您的代码中使用,那么假设一个完整的清理/构建周期,问题就不大了。如果您的代码随后覆盖了更广泛的受众,那么这将成为一个更大的问题。

于 2012-08-02T08:12:09.237 回答