我发现当在一个项目中声明一个常量(静态final,在编译时初始化)时,另一个项目中对它的引用在编译时会被文字替换。
似乎避免这种情况的唯一方法是让引用引用常量字段而不是文字是在类中声明常量(而不是接口)并省略“final”,例如:
public class MyClass {
public static String MY_CONSTANT = "The constant value";
}
不幸的是,在我理解这个之前,我编写了一个充满常量的接口,现在为了实现常量的更改,我们必须识别引用它的所有项目并重新编译它们。我担心会有什么事情发生。
另外,没有“最终”修饰符的常量不是完全恒定的,是吗?
是否有一个编译选项可以抑制文字替换常量引用?
答案 0 :(得分:3)
你只需要一些不是compile-time constant expression的东西。例如,方法调用不是。因此,只需在每个文字的末尾添加.intern()
将使其逃脱规则。然后每个引用站点必须确保初始化目标类型并读取当前值。
更改此行为的编译器选项是不可能的,因为它会违反Java语言规范。