首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >for语句中的Final关键字

for语句中的Final关键字
EN

Stack Overflow用户
提问于 2010-07-28 10:28:12
回答 5查看 687关注 0票数 3

我正在阅读一些在web上找到的代码,并发现下面这几行代码(java):

代码语言:javascript
复制
private List<String> values;

[...]

for (final String str : values) {
   length += context.strlen(str);
}

在for循环中声明变量final有什么好处?我认为在for循环中指定的变量已经是只读的(例如,在上面的例子中不能给'str‘赋值)。

Thx

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-07-28 10:39:33

在for循环中声明变量final的好处是什么?

在一小段代码中不是很多,但是,如果它有助于避免在循环时更改引用。

例如:

代码语言:javascript
复制
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,最后一行anotherComputation可能会使用与迭代中定义的值不同的值,并且可能会引入细微的错误,而在阅读其他代码时,维护者将尝试找出该方法如何使用正确的值失败。

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

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

代码语言:javascript
复制
... 
for( final String s : values ) {
  s = new StringBuilder( s ).reverse().toString();
}

此代码在编译时variable s might already have been assigned失败

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

代码语言:javascript
复制
for( final String s : value ) {
    doSomething( new InnerClass() {
       void something() {
             s.length();// accesing s from within the inner class 
       }
    });
 }
票数 5
EN

Stack Overflow用户

发布于 2010-07-28 10:44:28

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

  • 您可以防止自己意外地将更改循环变量的语句添加到循环体中。
  • 您可以向正在阅读代码的其他人清楚地表明,循环变量不会在循环体中更改。

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

我认为在

循环中指定的变量已经是只读的(例如,在上面的例子中不能给'str‘赋值)。

不是的。for循环变量(如果没有声明为final) 可以在循环体中进行修改。

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

票数 2
EN

Stack Overflow用户

发布于 2010-07-28 10:39:17

我认为在for循环中指定的变量已经是只读的

它不是只读的,试试看。

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

在任何情况下,都不要把你在web上找到的任意代码样本当作样式模型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3349458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档