如果我有一个布尔类型的字段:
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 Compiled from "Test.java" public class Test extends java.lang.Object{ public Test(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: return
public static void main(java.lang.String[]); Code: 0: return
}
可以看到,没有System.out.println
! :)
if(DEBUG && condition_that_may_be_true) ...
的语句时,如果 DEBUG
总是为 false,它就会被剪掉。 - twolfe18是的,Java编译器会消除由常量控制的if
块内的编译代码。这是一种可以接受的方式,用于条件编译“调试”代码,您不想将其包含在生产构建中。