Java预处理器
如果我有一个布尔字段如:
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 -ctesting 从“Test.java”编译 公共类Test扩展java.lang.Object { public Test(); 码: 0:aload_0 1:调用特定的#1; //方法java / lang / Object。“”:() 4:回报 public static void main(java.lang.String []); 码: 0:返回 }
正如你所看到的,没有System.out.println
! 🙂
是的,Java编译器将消除由常量控制的块内的编译代码。 这是一种可接受的方式来有条件地编译您不想包含在生产版本中的“debugging”代码。