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

这是来自有效的Java

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

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

下面是这样一个常量的例子:

public static final int APPLE_FUJI = 0;

答案 1

假设您有两个文件:

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。常量值将复制到使用它的每段代码中,而不是在执行时要求从中请求值。SOMETHINGjava BarFoo

在实践中,如果您在任何更改时重新编译所有内容,这不是问题。


答案 2

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

如果你不这样做,你不会得到警告,而是不正确的行为。

如果你的编译时常量只在代码中使用,那么假设一个完整的清理/构建周期,它就不那么成问题了。如果你的代码随后接触到更广泛的受众,那么这就变成了一个更大的问题。