2009-08-27 79 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 –