在增强型for循环中使用final作为循环变量的目的是什么?

时间:2013-08-02 14:35:08

标签: java variables foreach final

我理解以下声明如何运作。

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

但是在这里使用final关键字的目的是什么?

5 个答案:

答案 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();

}

我认为它回答了这个问题。