javac根据赋值方法不同地处理静态final

Mil*_*son 5 java compiler-construction final class javac

当我编译:

public static final boolean FOO = false;
public static final void fooTest() {
    if (FOO) {
        System.out.println("gg");
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到一个空方法fooTest() {}.但是当我编译时:

static boolean isBar = false;
public static final boolean BAR = isBar;
public static final void fooTest() {
    if (BAR) {
        System.out.println("gg");
    }
}
Run Code Online (Sandbox Code Playgroud)

if语句包含在已编译的类文件中.这是否意味着java中有两种不同的"类型"静态final,或者这仅仅是编译器优化?

Cyr*_* Ka 7

在第一种情况下,编译器进行优化.它知道Foo将永远是false和杀死代码永远不会达到.

在第二种情况下,您isBar要将非最终变量的值赋值给BAR.编译器无法判断变量isBar是否已在其他位置被修改,尤其是如果它不是私有的.因此,它不确定的价值BAR.因此他不能做优化.