考虑这种情况:
public Class1 {
public static final String ONE = "ABC";
public static final String TWO = "DEF";
}
public Class2 {
public void someMethod() {
System.out.println(Class1.ONE + Class1.TWO);
}
}
Run Code Online (Sandbox Code Playgroud)
通常,您会期望编译器内联ONE和TWO常量.但是,这种行为有保证吗?你可以在类路径中没有Class1的运行时Class2部署,并期望它无论编译器如何工作,或者这是一个可选的编译器优化?
编辑:为什么要这样做?好吧,我有一个常量,它将在应用程序的两端(通过RMI的客户端和服务器)之间共享,并且在这种特定情况下将常量放在一个只能位于该除法的一侧的类上是非常方便的(因为它在逻辑上是拥有该常量值的那个而不是将它放在任意常量类中,因为它需要由代码的两端共享.在编译时它的所有一组源文件,但在构建时它被包分开.
我碰巧在我的工作场所遇到过Java代码.这是场景:有两个类 - ClassA和ClassB.
ClassA除了4个公共静态最终字符串值之外什么都没有.它的目的是使用那些值ClassA.variable(不要问我为什么,这不是我的代码).
ClassB进口ClassA.我编辑了字符串值ClassA并对其进行了编译.当我跑步时,ClassB我可以看到它使用的是旧值 - 而不是新值.我必须重新编译ClassB才能使用新的值ClassA!(我不得不重新编译其他导入的类ClassA!)
这只是因为JDK 1.6或我之前应该知道重新编译的ClassB!开导我.:)