编译时在代码中替换 Java 静态最终值?

2022-09-02 11:30:32

在java中,假设我有以下

==fileA.java==
class A
{  
    public static final int SIZE = 100;
}  

然后在另一个文件中,我使用此值

==fileB.java==  
import A;
class b
{
      Object[] temp = new Object[A.SIZE];
}

当编译时,它确实被替换为值100,因此如果我要替换FileA.jar而不是FileB.jar,对象数组会得到新值,还是会被硬编码为100,因为这是最初构建时的值?SIZE


答案 1

是的,Java 编译器确实会像示例中那样将静态常量值替换为其文本值。SIZE

所以,如果你以后在类中更改,但你不重新编译类,你仍然会在类中看到旧值。您可以轻松测试:SIZEAbb

文件 A.java

public class A {
    public static final int VALUE = 200;
}

文件 B.java

public class B {
    public static void main(String[] args) {
        System.out.println(A.VALUE);
    }
}

编译 A.java 和 B.java。现在运行:java B

更改 A.java 中的值。重新编译 A.java,但不重新编译 B.java。再次运行,您将看到正在打印的旧值。


答案 2

你可以通过以下操作来防止常量被编译成 B:

class A
{  
    public static final int SIZE;

    static 
    {
        SIZE = 100;
    }
}  

推荐