web-dev-qa-db-ja.com

Javaプリプロセッサ

次のようなブールフィールドがある場合:

_private static final boolean DEBUG = false;_

私のコード内には、次のようなステートメントがあります。

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

Javaプリプロセッサはifステートメントと到達不能コードを取り除くだけですか?

45
twolfe18

ほとんどのコンパイラはステートメントを削除します。例えば:

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 
 "Test.Java" 
からコンパイルpublicclass Test extends Java.lang.Object {
 public Test(); 
コード:
 0:aload_0 
 1:invokespecial#1; //メソッドJava/lang/Object。 "" :()V 
 4:return 
 
 public static void main(Java.lang.String []); 
コード:
 0:return 
 
} 

ご覧のとおり、System.out.println! :)

115
Adam Paynter

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

13
Greg Hewgill