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

Kri*_*tal 20 java variables foreach final

我理解以下声明是如何工作的.

for(final Animal animal : animalList){
//do some function
}
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*n C 31

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

  • 它可以简单地避免在循环体中意外更改循环变量.(或者记录循环变量不会被更改的事实.)

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

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

    如果您final在此示例中省略,则是编译错误.

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


Tal*_*ala 7

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

避免这种可能导致混淆的情况.

 for(Animal animal : animalList){
       //do some function
       animal = anotherAnimal;
       // use animal variable here
    }
Run Code Online (Sandbox Code Playgroud)

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