web-dev-qa-db-ja.com

拡張forループでfinalfor the loop変数を使用する目的は何ですか?

以下のステートメントがどのように機能するかを理解しています。

for(final Animal animal : animalList){
//do some function
}

しかし、ここで最後のキーワードを使用する目的は何ですか?

20
Krithika Vittal

これを行う理由は2つ考えられます。

  • これは、ループ本体で誤ってループ変数を変更することを回避する方法にすぎない可能性があります。 (またはdocumentにループ変数が変更されないという事実。)

  • これは、匿名の内部クラスでループ変数を参照できるようにするために行うことができます。例えば:

    for(final Animal animal : animalList){
        executor.submit(new Runnable(){
            public void run() {
                animal.feed();
            }
        });
    }
    

    この例でfinalを省略すると、コンパイルエラーになります。

    [〜#〜] update [〜#〜] Java 8以降のバージョンではコンパイルエラーではありません。非ローカル変数は次の場合にのみ必要になります。 be実質的にfinal簡単に言えば、変数が割り当てられていないことを意味します(割り当て演算子または前後のインクリメントまたはデクリメント演算子を使用)初期宣言/初期化後。

29
Stephen C

finalキーワードを追加しても、ここではパフォーマンスに違いはありません。ループ内で再割り当てされていないことを確認する必要があります。

混乱を招く可能性のあるこの状況を回避するため。

 for(Animal animal : animalList){
       //do some function
       animal = anotherAnimal;
       // use animal variable here
    }

ループ内の無名関数でこの変数を使用する必要がある場合もあります

7
Tala

これは、animalの値がforループによって設定されると変更できないことを意味します。これは、ループのある時点で匿名クラス内でanimalを参照する場合に必要になることがあります。

明示的に必要でない場合でも、finalを変更しない変数を作成することをお勧めします。間違いを見つけるのに役立ち、コードをより自己文書化することができます。

3
Chris Bode

もう1つのJavaベストプラクティスです。

final宣言により、Javaコンパイラはループvariableへの割り当てを拒否します。

機会があればいつでも すべての拡張forステートメントループ変数finalを宣言する

1
Suresh Atta

このコードは、この同等のコードのシンタックスシュガーです。

for (final Iterator<Animal> iterator = animals.iterator(); iterator.hasNext(); ) {
  final Animal animal = iterator.next();

}

質問の答えだと思います。

0
kan