如果我有一个布尔字段,例如:
private static final boolean DEBUG = false;
在我的代码中,我有如下语句:
if(DEBUG) System.err.println("err1");
Java 预处理器是否只是摆脱了 if 语句和无法访问的代码?
如果我有一个布尔字段,例如:
private static final boolean DEBUG = false;
在我的代码中,我有如下语句:
if(DEBUG) System.err.println("err1");
Java 预处理器是否只是摆脱了 if 语句和无法访问的代码?
大多数编译器会删除该语句。例如:
public class Test {
private static final boolean DEBUG = false;
public static void main(String... args) {
if (DEBUG) {
System.out.println("Here I am");
}
}
}
编译完这个类后,我通过以下javap
命令打印生成的指令列表:
javap -c 测试 编译自“Test.java” 公共类测试扩展 java.lang.Object{ 公共测试(); 代码: 0:aload_0 1:调用特殊#1;//方法 java/lang/Object."":()V 4:返回 公共静态无效主(java.lang.String[]); 代码: 0:返回 }
如您所见,不System.out.println
!:)
是的,Java 编译器将消除if
由常量控制的块中的已编译代码。这是有条件地编译您不想包含在生产构建中的“调试”代码的可接受方式。