25

我了解以下语句的工作原理。

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

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

4

5 回答 5

35

这样做有两个可能的原因:

  • 它可能只是一种避免在循环体中意外更改循环变量的方法。(或记录循环变量不会被更改的事实。)

  • 可以这样做,以便您可以在匿名内部类中引用循环变量。例如:

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

    如果您final在此示例中省略了,则会出现编译错误。

    更新它不是 Java 8 及更高版本中的编译错误。非局部变量现在只需要有效 final。简而言之,这意味着在初始声明/初始化之后没有将变量分配给(使用赋值运算符或前/后递增或递减运算符)。

于 2013-08-02T14:41:45.237 回答
9

添加final关键字在这里没有性能差异。只需要确保它没有在循环中重新分配。

为了避免这种可能导致混乱的情况。

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

您可能还需要在循环内的匿名函数中使用此变量

于 2013-08-02T14:40:26.407 回答
3

它只是意味着animal一旦被 for 循环设置,它的值就不能改变。如果您要animal在循环中的某个点在匿名类中引用,则可能需要这样做。

即使没有明确需要,最好将变量设为最终变量。它可以帮助您发现错误,并使代码更具自我记录性。

于 2013-08-02T14:40:43.270 回答
2

这是另一个java最佳实践。

final声明导致Java编译器拒绝对循环所做的任何分配variable

只要有机会,就声明所有增强的 for 语句循环变量 final

于 2013-08-02T14:40:41.987 回答
0

该代码是此等效代码的语法糖:

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

}

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

于 2013-08-02T14:42:47.923 回答