被初始化为编译期常量的 static final 变量的引用,在编译时被解析为常量值的一个本地拷贝,这恰好让java能实现条件编译
看例子:
我们看看Example类的main方法的字节码:
(使用命令 javap -c Example)
我们看到,压根没有关于if (Debug.debug)这条语句的处理,这个时候如果重新编译Debug 类而不重新编译 Example 类的话,运行Example类时一样会输出Debug信息
再看看 static final boolean debug = false; 时的结果
Example类的main方法的字节码:
(使用命令 javap -c Example)
这回甚至连println()相关的调用指令都省下了
看例子:
public class Example {
public static void main(String[] args) {
if (Debug.debug) {
System.out.println("Debug is true");
}
}
}
class Debug {
static final boolean debug = true;
}
我们看看Example类的main方法的字节码:
(使用命令 javap -c Example)
public static void main(java.lang.String[]);
Code:
0: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #22 // String Debug is true
5: invokevirtual #24 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
我们看到,压根没有关于if (Debug.debug)这条语句的处理,这个时候如果重新编译Debug 类而不重新编译 Example 类的话,运行Example类时一样会输出Debug信息
再看看 static final boolean debug = false; 时的结果
Example类的main方法的字节码:
(使用命令 javap -c Example)
public static void main(java.lang.String[]);
Code:
0: return
这回甚至连println()相关的调用指令都省下了