【问题标题】:Avoiding Replacing Constant Reference With a Literal When Compiled [duplicate]编译时避免用文字替换常量引用[重复]
【发布时间】:2016-09-27 13:43:11
【问题描述】:

我发现当在一个项目中声明一个常量(静态 final,在编译时初始化)时,在另一个项目中对它的引用会在编译时被替换为文字。

似乎避免这种情况的唯一方法是让引用引用常量字段而不是文字,是在类(而不是接口)中声明常量并省略“final”,例如:

public class MyClass {
   public static String MY_CONSTANT = "The constant value";
 }

不幸的是,在我理解这一点之前,我编写了一个充满常量的接口,现在为了改变一个常量,我们必须识别所有引用它的项目并重新编译它们。恐怕会漏掉什么。

此外,没有“final”修饰符的常量并不完全是常量,是吗?

有没有一个编译选项可以禁止用字面量替换常量引用?

【问题讨论】:

  • 你发现了你对java知识的一个漏洞。并且记录在案:是的,这在某种程度上是较大设置中的一个问题,但是这是一个众所周知的问题。任何合理的构建系统都应该能够处理它;通过了解依赖关系和重新编译所有需要...的类的需要...
  • 不久前我们也犯过同样的错误。我们已经将接口更改为具有 getter-Methods。和一个实现类。请看一下来自 Joshua Bloch 的添加“Effective Java”。第 19 条:“仅使用接口来定义类型”

标签: java compile-time-constant


【解决方案1】:

您只需要不是compile-time constant expression 的东西。例如,方法调用不是。因此,只需在每个文字的末尾添加 .intern() 就会使其逃避规则。然后每个引用站点都必须确保目标类型已初始化并读取当前值。

改变这种行为的编译器选项是不可能的,因为它会违反 Java 语言规范。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2016-01-20
    • 2014-07-11
    • 2016-12-01
    • 1970-01-01
    • 2019-05-24
    相关资源
    最近更新 更多