Java for语句中的Final关键字

Java for语句中的Final关键字,java,Java,我在阅读一些在网上找到的代码时,发现了以下几行代码(java): 私有列表值; [...] for(最终字符串str:values){ 长度+=context.strlen(str); } 在for循环中声明变量final的优点是什么?我认为for循环中指定的变量已经是只读的(例如,在上面的示例中,无法为'str'赋值) Thx我认为for循环中指定的变量已经是只读的 它不是只读的,试试看 有些人喜欢将局部变量声明为“final”,不知道为什么。看来情况就是这样 在任何情况下,不要把你在网上找

我在阅读一些在网上找到的代码时,发现了以下几行代码(java):

私有列表值;
[...]
for(最终字符串str:values){
长度+=context.strlen(str);
}
在for循环中声明变量final的优点是什么?我认为for循环中指定的变量已经是只读的(例如,在上面的示例中,无法为'str'赋值)

Thx

我认为for循环中指定的变量已经是只读的
它不是只读的,试试看

有些人喜欢将局部变量声明为“final”,不知道为什么。看来情况就是这样

在任何情况下,不要把你在网上找到的任意代码样例看作是样式模型。 在for循环中声明变量final的优点是什么

在一小段代码中没有太多内容,但是,如果这有助于避免在循环时更改引用的话

例如:

for( String s : values ) {
     computeSomething( s );
      ... a dozen of lines here... 
     s = s.trim();// or worst s = getOtherString();
     ... another dozen of line 
     otherComputation( s );
 }
如果不使用final,那么最后一行
另一个计算
可能会使用与迭代中定义的值不同的值,并且可能会引入细微的错误,在阅读其他代码时,维护人员将尝试找出该方法在正确值下失败的原因

对于5-15行长的代码来说,这很容易识别,但是对于更大的代码段,相信我,这要困难得多

使用
final
将防止在编译时更改值

... 
for( final String s : values ) {
  s = new StringBuilder( s ).reverse().toString();
}
此代码在编译时失败
变量s可能已经被赋值

另一个优点是允许在匿名内部类中使用变量:

for( final String s : value ) {
    doSomething( new InnerClass() {
       void something() {
             s.length();// accesing s from within the inner class 
       }
    });
 }

不,它不是只读的。它是一个具有循环范围的临时变量

通过添加
final
关键字,可以使其成为只读

$ cat Finals.java
import java.util.List;


public class Finals {

    public static void main(String args[]){

        int ints[] = {1,2,3,4};

        for (Integer i:ints){
            i +=20;
            System.out.println(i);
        }    
    }    
}
$ javac Finals.java -cp .
$ java Finals
21
22
23
24
$ 

将循环变量声明为final纯粹是一种风格:

  • 您可以保护自己,避免意外地向循环体添加更改循环变量的语句

  • 您可以让阅读代码的其他人清楚地知道,循环变量不会在循环体中更改

我个人认为这不是什么大事。但那是因为我从来没有写过这样的代码。。。没有添加一个大的大胆的评论来解释发生了什么,以及为什么我决定这样做。(但如果你所处的环境中这种令人憎恶的行为司空见惯,我就能明白这一点。)

我认为for循环中指定的变量已经是只读的(例如,在上面的示例中,无法为'str'赋值)

没有。for循环变量(如果未声明为
final
可以在循环体中修改


如果您想阅读基本细节,for循环在中进行了描述。它没有明确提到声明为
final
的循环变量。但总体情况是,在
for
语句中定义的循环变量与任何其他变量之间的唯一区别在于作用域。

如果通过创建注释性类使用此变量,则有时将其声明为最终变量可能会有所帮助

例如:

    String[] names = {"my name"};
    for(final String name: names){
        new Object(){
            String objName = name;
        };
    }

Nikita,这个(答案)是一个很好的“评论”而不是答案的候选者。@Nikyta“有些人喜欢将局部变量声明为“最终的”。”。。。这是一种强调某些东西在其余生中不会改变的方式……除了有一个代表性的名称外,变量可以通过这种方式“更可读”。伙计们,我明白这一切都是为了不变性,我只是觉得这样的微观管理没什么意义。你不认为如果一大块代码很难理解,就应该把它分解成子例程或类似的东西,而不是注入一些小小的约束吗?不过,感谢内部类示例,这很有趣。@Nikita:One-word:当然,如果可能的话,for循环中的代码不应该超过10行,一个方法应该只包含一个for循环,并且应该尽可能避免嵌套循环。这正是我想要的,但是,有时你必须和其他人一起工作,有时你必须维护他们的代码,有时一个阻碍生产的bug是由这样微妙的事情产生的:'(
    String[] names = {"my name"};
    for(final String name: names){
        new Object(){
            String objName = name;
        };
    }