如果我有一個布爾字段,如:Java的預處理器
private static final boolean DEBUG = false;
和我的代碼中我有這樣的語句:
if(DEBUG) System.err.println("err1");
並在Java預處理器剛剛得到,如果擺脫了聲明和無法訪問的代碼?
如果我有一個布爾字段,如:Java的預處理器
private static final boolean DEBUG = false;
和我的代碼中我有這樣的語句:
if(DEBUG) System.err.println("err1");
並在Java預處理器剛剛得到,如果擺脫了聲明和無法訪問的代碼?
大多數編譯器將消除該聲明。例如:
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
! :)
+1瞭解如何自行測試的說明。 – akf
另外,我檢查了什麼時候你有一個類似'if(DEBUG && condition_that_may_be_true)...'的語句,如果DEBUG總是假,它就會將其切斷。 – twolfe18
+1模型答案 – butterchicken
是的,Java編譯器將消除由常量控制的if
塊內的編譯代碼。這是一種可接受的方式,用於有條件地編譯不想包含在生產版本中的「調試」代碼。
你可以給Java語言規範頁面說明這一點嗎? – Ralph
@Ralph:參見JLS中討論的[14.21 Unreachable Statements](http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.21)。關於「if」語句的位在該段的結尾附近。 –
頁面現在在這裏用於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 –
「Java語言沒有預處理器」(http://java.sun.com/developer/JDCTechTips/2003/tt0408.html)您是否在談論Java編譯器? –
感謝您的文章,我不知道Java沒有預處理器。所以我只是談論編譯器。 – twolfe18
確實,Java沒有一個與C/C++具有相同功能的預處理器。但它確實有提供編譯時處理的註釋處理器。請參閱[Oracle的註釋教程](http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html) – KomodoDave