次のようなブールフィールドがある場合:
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
、定数によって制御されるブロック内のコンパイル済みコードを削除します。これは、製品ビルドに含めたくない「デバッグ」コードを条件付きでコンパイルするための受け入れ可能な方法です。