【发布时间】: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