45

如果我有一个布尔字段,例如:

private static final boolean DEBUG = false;

在我的代码中,我有如下语句:

if(DEBUG) System.err.println("err1");

Java 预处理器是否只是摆脱了 if 语句和无法访问的代码?

4

2 回答 2

116

大多数编译器会删除该语句。例如:

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!:)

于 2009-08-27T23:34:02.987 回答
13

是的,Java 编译器将消除if由常量控制的块中的已编译代码。这是有条件地编译您不想包含在生产构建中的“调试”代码的可接受方式。

于 2009-08-27T23:31:28.780 回答