正如这里所讨论的,javac 和其他 Java 编译器可以为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
将是错误的并且不应该消除-statementtrue
的if
-branch。
然而,如果Foo
和Bar
实际上在同一个包中,则true
-branch 肯定应该被消除(如果编译器完全支持代码消除)。
不太确定如何最好地表达这个问题,但是:对于常量表达式 inFoo
需要多“接近”才能被认为是常量 in ?他们需要在同一个文件中吗?同一个包?同一个jar文件?还是根本不重要(即编译器是否总是将其视为常量并在编译时使用在构建路径中找到的值)?Bar
Foo
Bar
Foo.CONDITION