2009-08-27 117 views
41

如果我有一个布尔字段,如:Java的预处理器

private static final boolean DEBUG = false;

和我的代码中我有这样的语句:

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

并在Java预处理器刚刚得到,如果摆脱了声明和无法访问的代码?

+2

“Java语言没有预处理器”(http://java.sun.com/developer/JDCTechTips/2003/tt0408.html)您是否在谈论Java编译器? –

+0

感谢您的文章,我不知道Java没有预处理器。所以我只是谈论编译器。 – twolfe18

+0

确实,Java没有一个与C/C++具有相同功能的预处理器。但它确实有提供编译时处理的注释处理器。请参阅[Oracle的注释教程](http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html) – KomodoDave

回答

109

大多数编译器将消除该声明。例如:

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

+16

+1了解如何自行测试的说明。 – akf

+2

另外,我检查了什么时候你有一个类似'if(DEBUG && condition_that_may_be_true)...'的语句,如果DEBUG总是假,它就会将其切断。 – twolfe18

+1

+1模型答案 – butterchicken

12

是的,Java编译器将消除由常量控制的if块内的编译代码。这是一种可接受的方式,用于有条件地编译不想包含在生产版本中的“调试”代码。

+0

你可以给Java语言规范页面说明这一点吗? – Ralph

+3

@Ralph:参见JLS中讨论的[14.21 Unreachable Statements](http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.21)。关于“if”语句的位在该段的结尾附近。 –

+1

页面现在在这里用于jse7:http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.21以及jse5的这里:http://docs.oracle.com /javase/specs/jls/se5.0/html/statements.html#14.21 –