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”代码。