Я понимаю, как работает инструкция ниже.
for(final Animal animal : animalList){
//do some function
}
Но какова цель использования конечного ключевого слова здесь?
Я понимаю, как работает инструкция ниже.
for(final Animal animal : animalList){
//do some function
}
Но какова цель использования конечного ключевого слова здесь?
Для этого есть две возможные причины:
Это может быть просто способ избежать случайного изменения переменной цикла в теле цикла. (Или для документирования того, что переменная цикла не будет изменена.)
Это можно сделать так, чтобы вы могли ссылаться на переменную цикла в анонимном внутреннем классе. Например:
for(final Animal animal : animalList){
executor.submit(new Runnable(){
public void run() {
animal.feed();
}
});
}
Это ошибка компиляции, если вы не укажете final
в этом примере.
UPDATE, это не ошибка компиляции в Java 8 и более поздних версиях. Теперь нелокальная переменная требуется только окончательно. Говоря простыми словами, это означает, что переменная не назначена (с использованием оператора присваивания или оператора приращения или сокращения до/после) после первоначальной декларации/инициализации.
Добавление ключевого слова final
не влияет на производительность. Просто нужно было убедиться, что он не переназначен в цикле.
Чтобы избежать такой ситуации, которая может привести к путанице.
for(Animal animal : animalList){
//do some function
animal = anotherAnimal;
// use animal variable here
}
Вам также может понадобиться использовать эту переменную в анонимной функции внутри цикла
Это просто означает, что значение animal
не может измениться после его установки в цикле for. Это может потребоваться, если вы собираетесь ссылаться на animal
в пределах анонимного класса в какой-то момент цикла.
Даже если это явно не требуется, хорошая практика заключается в том, чтобы сделать переменные, которые не изменят окончательный. Это может помочь вам поймать ошибки и сделать код более самодокументированным.
Это другая лучшая практика Java.
Объявление final
заставляет компиляторы Java
отклонять любые присваивания, сделанные в цикле variable
.
Когда у вас есть шанс, Объявить все расширенные переменные цикла цикла оператора final
Код - это синтаксический сахар для этого эквивалентного кода:
for (final Iterator<Animal> iterator = animals.iterator(); iterator.hasNext(); ) {
final Animal animal = iterator.next();
}
Я думаю, что это ответ на вопрос.