我理解以下声明如何运作。
for(final Animal animal : animalList){
//do some function
}
但是在这里使用final关键字的目的是什么?
答案 0 :(得分:28)
有两个可能的原因:
它可以简单地避免在循环体中意外更改循环变量。 (或者记录循环变量不会被改变的事实。)
可以这样做,以便您可以在匿名内部类中引用循环变量。例如:
for(final Animal animal : animalList){
executor.submit(new Runnable(){
public void run() {
animal.feed();
}
});
}
如果您在此示例中省略final
,则会出现编译错误。
UPDATE 它不是Java 8及更高版本中的编译错误。现在,非局部变量只需有效最终。简单来说,这意味着在初始声明/初始化之后,变量未分配给(使用赋值运算符或前/后递增或递减运算符)。
答案 1 :(得分:7)
添加final
关键字在这里没有任何性能差异。只需要确保它不会在循环中重新分配。
避免这种可能导致混淆的情况。
for(Animal animal : animalList){
//do some function
animal = anotherAnimal;
// use animal variable here
}
您还可能需要在循环内的匿名函数中使用此变量
答案 2 :(得分:3)
它只是意味着animal
的值一旦被for循环设置就不会改变。如果您要在循环中的某个位置引用匿名类中的animal
,则可能需要这样做。
即使没有明确需要,最好还是制作最终不会改变的变量。它可以帮助您捕捉错误,并使代码更加自我记录。
答案 3 :(得分:1)
这是另一个java最佳实践。
final
声明会导致Java
编译器拒绝对循环variable
所做的任何分配。
如果有机会,Declare all enhanced for statement loop variables final
答案 4 :(得分:0)
代码是此等效代码的语法糖:
for (final Iterator<Animal> iterator = animals.iterator(); iterator.hasNext(); ) {
final Animal animal = iterator.next();
}
我认为它回答了这个问题。