以下のステートメントがどのように機能するかを理解しています。
for(final Animal animal : animalList){
//do some function
}
しかし、ここで最後のキーワードを使用する目的は何ですか?
これを行う理由は2つ考えられます。
これは、ループ本体で誤ってループ変数を変更することを回避する方法にすぎない可能性があります。 (またはdocumentにループ変数が変更されないという事実。)
これは、匿名の内部クラスでループ変数を参照できるようにするために行うことができます。例えば:
for(final Animal animal : animalList){
executor.submit(new Runnable(){
public void run() {
animal.feed();
}
});
}
この例でfinal
を省略すると、コンパイルエラーになります。
[〜#〜] update [〜#〜] Java 8以降のバージョンではコンパイルエラーではありません。非ローカル変数は次の場合にのみ必要になります。 be実質的にfinal簡単に言えば、変数が割り当てられていないことを意味します(割り当て演算子または前後のインクリメントまたはデクリメント演算子を使用)初期宣言/初期化後。
final
キーワードを追加しても、ここではパフォーマンスに違いはありません。ループ内で再割り当てされていないことを確認する必要があります。
混乱を招く可能性のあるこの状況を回避するため。
for(Animal animal : animalList){
//do some function
animal = anotherAnimal;
// use animal variable here
}
ループ内の無名関数でこの変数を使用する必要がある場合もあります
これは、animal
の値がforループによって設定されると変更できないことを意味します。これは、ループのある時点で匿名クラス内でanimal
を参照する場合に必要になることがあります。
明示的に必要でない場合でも、finalを変更しない変数を作成することをお勧めします。間違いを見つけるのに役立ち、コードをより自己文書化することができます。
もう1つのJavaベストプラクティスです。
final
宣言により、Java
コンパイラはループvariable
への割り当てを拒否します。
機会があればいつでも すべての拡張forステートメントループ変数finalを宣言する
このコードは、この同等のコードのシンタックスシュガーです。
for (final Iterator<Animal> iterator = animals.iterator(); iterator.hasNext(); ) {
final Animal animal = iterator.next();
}
質問の答えだと思います。