如
here所述,javac和其他Java编译器可能为条件为
“Constant Expression”的if语句提供代码消除功能.
如果我的代码使用依赖于不同包中定义的其他常量表达式的常量表达式,那么这将如何影响?
例如,假设我在相应的指定包中有以下类:
package foo;
public class Foo {
public static final boolean CONDITION = false;
}
和
package bar;
import foo.Foo;
public class Bar {
public void test() {
if (Foo.CONDITION) {
System.out.println("This line of code could be eliminated.");
} else {
System.out.println("This line of code will be executed.");
}
}
}
显然,如果foo-package在运行时从外部jar文件加载,则编译器在技术上不能假设Foo.CONDITION将为false,并且不应该消除if-statement的真实分支.
而如果Foo和Bar实际上在同一个软件包中,则真正的分支应该绝对被消除(如果编译器完全支持代码消除).
不太确定如何最好地说出这个问题,但是:Foo如何“接近”需要在Bar中持续表达,以便在Bar中被认为是不变的?他们需要在同一个文件中吗?同样的包装?同一个jar文件?或者根本不重要(即编译器总是将Foo.CONDITION视为常量,并在编译时使用构建路径中找到的值)?