避免在编译时用文字替换常量引用
Avoiding Replacing Constant Reference With a Literal When Compiled
我发现当在一个项目中声明一个常量(静态最终,在编译时初始化)时,在另一个项目中对它的引用在编译时被替换为文字。
似乎避免这种情况并使引用引用常量字段而不是文字的唯一方法是在 class 中声明常量(而不是接口)并省略 "final," 例如:
public class MyClass {
public static String MY_CONSTANT = "The constant value";
}
不幸的是,在我理解这一点之前,我编写了一个充满常量的接口,现在要对常量进行更改,我们必须识别所有引用它的项目并重新编译它们。恐怕会漏掉一些东西。
此外,没有 "final" 修饰符的常量不完全是常量,对吗?
是否有编译选项可以禁止将常量引用替换为文字?
您只需要 compile-time constant expression 以外的东西。例如,方法调用不是。因此,只需在每个文字的末尾添加 .intern()
即可使其逃避规则。然后每个引用站点都必须确保目标类型已初始化并读取当前值。
更改此行为的编译器选项是不可能的,因为它会违反 Java 语言规范。
我发现当在一个项目中声明一个常量(静态最终,在编译时初始化)时,在另一个项目中对它的引用在编译时被替换为文字。
似乎避免这种情况并使引用引用常量字段而不是文字的唯一方法是在 class 中声明常量(而不是接口)并省略 "final," 例如:
public class MyClass {
public static String MY_CONSTANT = "The constant value";
}
不幸的是,在我理解这一点之前,我编写了一个充满常量的接口,现在要对常量进行更改,我们必须识别所有引用它的项目并重新编译它们。恐怕会漏掉一些东西。
此外,没有 "final" 修饰符的常量不完全是常量,对吗?
是否有编译选项可以禁止将常量引用替换为文字?
您只需要 compile-time constant expression 以外的东西。例如,方法调用不是。因此,只需在每个文字的末尾添加 .intern()
即可使其逃避规则。然后每个引用站点都必须确保目标类型已初始化并读取当前值。
更改此行为的编译器选项是不可能的,因为它会违反 Java 语言规范。