说int枚举模式是编译时常量是什么意思?

这来自Effective Java

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

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

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

public static final int APPLE_FUJI = 0; 

假设您有两个文件:

 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并且它仍然会打印1.常量值将被复制到使用它的每一段代码,而不是在执行时从Foo请求值。

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

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

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

如果您的编译时常量仅用于您的代码中,那么假设完整的清理/构建周期则不会出现问题。 如果您的代码随后扩大到更广泛的受众群体,那么这就变成了一个问题。