1

なぜこのコード スニペットがコンパイルおよび実行されるのか疑問に思っていました

private BusRoute readRouteCursor( final Cursor c )
{
    final BusRoute result;
    final int count;
    if ( c == null || ( count = c.getCount() ) < 1 )
    {
        result = null;
    }
    else
    {
        /*
         * Reads cursor
         */
    }
    return result;
}

私はそれをうまく機能させていますが、それについて考えるのをやめたとき、なぜ変数countがそうであるのか疑問に思いましたが、句finalの最初の条件が満たされた場合、変数が設定されない可能性があります。if

コンパイラはcountその時点からの使用がないことを確認するのに十分賢いので、それは機能し、初期化する必要はまったくありませんか?

4

4 に答える 4

2

答えは簡単です。最終変数は、宣言ステップで初期化する必要はありません。「ブランクファイナル」とも呼ばれます。

于 2012-10-12T13:21:15.330 に答える
1

実際、count変数がオブジェクトまたはクラスのフィールドである場合にのみ、これは失敗します。

なんで ?フィールドにはデフォルトでデフォルト値が割り当てられているためです。したがって、あなたの声明:

count = c.getCount()

2番目の割り当てを表すため、事実上失敗します...

ただし、ローカル変数の場合、宣言時にデフォルト値は割り当てられません。

count変数が複数回評価されることはないため、コードは完全に有効です。

于 2012-10-12T13:23:41.377 に答える