私は次のようにブール型フィールドがある場合:私のような文を持っているJavaのプリプロセッサ
private static final boolean DEBUG = false;
と私のコード内:
if(DEBUG) System.err.println("err1");
は、Javaプリプロセッサだけであれば取り除くんステートメントと到達不能コード?
私は次のようにブール型フィールドがある場合:私のような文を持っているJavaのプリプロセッサ
private static final boolean DEBUG = false;
と私のコード内:
if(DEBUG) System.err.println("err1");
は、Javaプリプロセッサだけであれば取り除くんステートメントと到達不能コード?
ほとんどのコンパイラはこの文を削除します。たとえば:
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 Compiled from "Test.java" public class Test extends java.lang.Object{ public Test(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: return public static void main(java.lang.String[]); Code: 0: return }
あなたが見ることができるように、無System.out.println
! :)
+1あなた自身のテスト方法に関する指示。 – akf
また、 'if(DEBUG && condition_that_may_be_true)...'のような文があるときにチェックし、 'DEBUG'が常にfalseの場合は、それを切り捨てます。 – twolfe18
+1モデル回答 – butterchicken
はい、Javaコンパイラは、定数によって制御されるブロックif
内のコンパイル済みコードを削除します。これは、実稼働ビルドに含めたくない "デバッグ"コードを条件付きでコンパイルするための許容可能な方法です。
Java言語仕様ページにこれを記載できますか? – Ralph
@Ralph:JLSでの議論については、[14.21到達不能な文](http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.21)を参照してください。 'if'ステートメントに関するビットは、そのセクションの終わりの近くにあります。 –
ここにjse7のページがあります:http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.21ここでjse5:http://docs.oracle.com /javase/specs/jls/se5.0/html/statements.html#14.21 –
"Java言語にはプリプロセッサがありません"(http://java.sun.com/developer/JDCTechTips/2003/tt0408.html)Javaコンパイラについてお話ししていますか? –
記事のおかげで、Javaにプリプロセッサがないことは分かりませんでした。だから私はコンパイラについて話しています。 – twolfe18
JavaにはC/C++と同じ機能を持つプリプロセッサがないことは事実です。しかし、コンパイル時処理を提供する注釈プロセッサを備えています。 [Oracleの注釈チュートリアル](http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html)を参照してください。 – KomodoDave