Какова цель использования final для переменной цикла в расширенном для цикла?

Я понимаю, как работает инструкция ниже.

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

Но какова цель использования конечного ключевого слова здесь?

Ответ 1

Для этого есть две возможные причины:

  • Это может быть просто способ избежать случайного изменения переменной цикла в теле цикла. (Или для документирования того, что переменная цикла не будет изменена.)

  • Это можно сделать так, чтобы вы могли ссылаться на переменную цикла в анонимном внутреннем классе. Например:

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

    Это ошибка компиляции, если вы не укажете final в этом примере.

    UPDATE, это не ошибка компиляции в Java 8 и более поздних версиях. Теперь нелокальная переменная требуется только окончательно. Говоря простыми словами, это означает, что переменная не назначена (с использованием оператора присваивания или оператора приращения или сокращения до/после) после первоначальной декларации/инициализации.

Ответ 2

Добавление ключевого слова final не влияет на производительность. Просто нужно было убедиться, что он не переназначен в цикле.

Чтобы избежать такой ситуации, которая может привести к путанице.

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

Вам также может понадобиться использовать эту переменную в анонимной функции внутри цикла

Ответ 3

Это просто означает, что значение animal не может измениться после его установки в цикле for. Это может потребоваться, если вы собираетесь ссылаться на animal в пределах анонимного класса в какой-то момент цикла.

Даже если это явно не требуется, хорошая практика заключается в том, чтобы сделать переменные, которые не изменят окончательный. Это может помочь вам поймать ошибки и сделать код более самодокументированным.

Ответ 5

Код - это синтаксический сахар для этого эквивалентного кода:

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

}

Я думаю, что это ответ на вопрос.