我理解下面这个语句的工作原理。
for(final Animal animal : animalList){
//do some function
}
但是在这里使用final关键字的目的是什么?
这样做有两个可能的原因:
这可能只是一种避免在循环体中意外更改循环变量的方法。(或者用于记录循环变量不会被更改的事实。)
这可能是为了可以在匿名内部类中引用循环变量。例如:
for(final Animal animal : animalList){
executor.submit(new Runnable(){
public void run() {
animal.feed();
}
});
}
如果在此示例中省略了final
,将会导致编译错误。
更新:在Java 8及更高版本中,这不再是编译错误。非局部变量现在只需要是有效的final。简单来说,这意味着该变量在初始声明/初始化后没有被赋值(使用赋值运算符或前/后增量或减量运算符)。
添加final
关键字在这里不会产生性能差异,只是需要确保它在循环中不被重新赋值。
为避免可能导致混淆的情况,请这样做。
for(Animal animal : animalList){
//do some function
animal = anotherAnimal;
// use animal variable here
}
您可能还需要在循环内使用此变量的匿名函数。这意味着一旦for循环设置了animal
的值,它的值就不能再改变。如果你在循环中的某个时候需要在匿名类中引用animal
,那么可能需要这样做。
即使没有明确要求,将不会改变的变量定义为final也是一个好习惯。它可以帮助你捕捉错误,并使代码更加自我说明。
final
,我就会选择这样做。如果我错了,请纠正我 :) - Suresh Attafinal
是最佳实践吗?此外,你提供的链接并没有真正说明将变量标记为final
和不标记之间的区别。请注意,在两个示例中都可以使用continue
关键字,行为将是相同的。 - Luiggi Mendoza这段代码是等价于下面这段代码的语法糖:
for (final Iterator<Animal> iterator = animals.iterator(); iterator.hasNext(); ) {
final Animal animal = iterator.next();
}
我认为它回答了这个问题。
Animal
怎么能轻易地变成String
。不,这并没有回答问题。 - Luiggi Mendoza
animal
不能被重新赋值,比如animal = new Animal(); //在循环代码内部
。 - Luiggi Mendozaanimal
不会被分配一个新的引用吗? - Learn More