次のようなブールフィールドがある場合:
private static final boolean DEBUG = false;
私のコード内には、次のようなステートメントがあります。
if(DEBUG) System.err.println("err1");
Java プリプロセッサは、if ステートメントと到達不能コードを取り除くだけですか?
次のようなブールフィールドがある場合:
private static final boolean DEBUG = false;
私のコード内には、次のようなステートメントがあります。
if(DEBUG) System.err.println("err1");
Java プリプロセッサは、if ステートメントと到達不能コードを取り除くだけですか?
ほとんどのコンパイラは、ステートメントを削除します。例えば:
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。:)
はい、Java コンパイラはif、定数によって制御されるブロック内のコンパイル済みコードを削除します。これは、製品ビルドに含めたくない「デバッグ」コードを条件付きでコンパイルするための受け入れ可能な方法です。