4

次のようなコードがある場合

public static void main(String args[]){
    int x = 0;
    while (false) { x=3; }  //will not compile  
}

コンパイラは到達できないコードであると文句を言いx=3ますが、次のようなコードがある場合

public static void main(String args[]){
    int x = 0;
    if (false) { x=3; }
    for( int i = 0; i< 0; i++) x = 3;   
}

その後、内部のコードを介して正しくコンパイルされif statementfor loop到達できなくなります。この冗長性が Java ワークフロー ロジックによって検出されないのはなぜですか? ユースケースはありますか?

4

3 に答える 3

7

Java 言語仕様で説明されているように、この機能は「条件付きコンパイル」用に予約されています。

JLS で説明されている例は、定数がある可能性があることです。

static final boolean DEBUG = false;

およびこの定数を使用するコード

if (DEBUG) { x=3; }

上記のコードでコンパイル エラーが発生した場合、コードに他の変更を加えることなく簡単にDEBUGからtrueに変更できる可能性を提供するという考え方です。false

于 2014-06-01T07:09:38.123 に答える
2

if 条件の使用例はデバッグです。if私の知る限り、 for -statements (for ループではなく)の仕様では、次のようなコードを許可することが明示的に許可されています。

class A {
    final boolean debug = false;

    void foo() {
        if (debug) {
            System.out.println("bar!");
        }
        ...
    }
}

後で (または実行時にデバッガーを介して) の値を変更して、debug出力を取得できます。

編集クリスチャンがコメントで指摘したように、仕様にリンクする回答はここにあります。

于 2014-06-01T07:09:01.540 に答える
2

falsefor ループに関しては、 while ループ内での定数の使用ほど簡単に検出できないと思います。

に関してはif、コンパイル時にバイトコードからデバッグコードを削除できるようにするために、それを承認するという意図的な選択でした。

private static final boolean DEBUG = false; // or true

...

if (DEBUG) {
    ...
}
于 2014-06-01T07:09:43.837 に答える