这是来自有效的Java
使用 int 枚举模式的程序很脆弱。因为 int 枚举是编译时常量,所以它们被编译到使用它们的客户端中。
有人可以解释为什么 int 枚举模式被称为编译类型常量以及编译到客户端中的含义是什么?
这是一个这样的常数的例子:
public static final int APPLE_FUJI = 0;
这是来自有效的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
它仍然Foo
会打印 1。常量值将被复制到使用它的每一段代码中,而不是在执行时询问该值。
在实践中,如果您在任何时间发生任何变化时重新编译所有内容,这不是问题。
值“0”本身将.class
在编译期间内置到文件中。如果您随后更改该值,则必须重新编译使用它的所有内容,包括使用您的应用程序/库的任何客户端代码。
如果不这样做,您将不会收到警告,而是会收到不正确的行为。
如果您的编译时常量仅在您的代码中使用,那么假设一个完整的清理/构建周期,问题就不大了。如果您的代码随后覆盖了更广泛的受众,那么这将成为一个更大的问题。