2009-08-27 15 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'が常にfalseの場合は、それを切り捨てます。 – twolfe18

+1

+1モデル回答 – butterchicken

12

はい、Javaコンパイラは、定数によって制御されるブロックif内のコンパイル済みコードを削除します。これは、実稼働ビルドに含めたくない "デバッグ"コードを条件付きでコンパイルするための許容可能な方法です。

+0

Java言語仕様ページにこれを記載できますか? – Ralph

+3

@Ralph:JLSでの議論については、[14.21到達不能な文](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 –