说 int 枚举模式是编译时常量是什么意思?
2022-09-04 00:49:33
这是来自有效的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);
}
}
编译它们两者,运行,它将打印出1。java Bar
现在更改 Foo.java 为 2,然后重新编译 Foo.java。重新运行,它仍将打印 1。常量值将复制到使用它的每段代码中,而不是在执行时要求从中请求值。SOMETHING
java Bar
Foo
在实践中,如果您在任何更改时重新编译所有内容,这不是问题。
值“0”本身将在编译期间内置到文件中。如果随后更改该值,则必须重新编译使用它的所有内容,包括使用应用程序/库的任何客户端代码。.class
如果你不这样做,你不会得到警告,而是不正确的行为。
如果你的编译时常量只在代码中使用,那么假设一个完整的清理/构建周期,它就不那么成问题了。如果你的代码随后接触到更广泛的受众,那么这就变成了一个更大的问题。