次のようなブールフィールドがある場合:
_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 "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
! :)
はい、Javaコンパイラは、定数によって制御されるif
ブロック内のコンパイル済みコードを削除します。これは、条件付きでコンパイルしない「デバッグ」コードを条件付きでコンパイルするための許容可能な方法です。プロダクションビルドに含めたい。