45

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

private static final boolean DEBUG = false;

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

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

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

4

2 に答える 2

116

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

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.java」からコンパイル
    public class Test extends java.lang.Object{
    公開テスト();
      コード:
       0: aload_0
       1: 特別な #1 を呼び出します。//メソッド java/lang/Object."":()V
       4: 戻る

    public static void main(java.lang.String[]);
      コード:
       0: 戻る

    }

ご覧のとおり、違いますSystem.out.println。:)

于 2009-08-27T23:34:02.987 に答える
13

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

于 2009-08-27T23:31:28.780 に答える