我正在阅读一些在web上找到的代码,并发现下面这几行代码(java):
private List<String> values;
[...]
for (final String str : values) {
length += context.strlen(str);
}在for循环中声明变量final有什么好处?我认为在for循环中指定的变量已经是只读的(例如,在上面的例子中不能给'str‘赋值)。
Thx
发布于 2010-07-28 10:39:33
在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,最后一行anotherComputation可能会使用与迭代中定义的值不同的值,并且可能会引入细微的错误,而在阅读其他代码时,维护者将尝试找出该方法如何使用正确的值失败。
对于长度为5- 15行的代码来说,这很容易识别,但对于更大的代码段来说,相信我,要难得多。
使用final将防止在编译时更改值。
...
for( final String s : values ) {
s = new StringBuilder( s ).reverse().toString();
}此代码在编译时variable s might already have been assigned失败
另一个好处是允许变量在匿名内部类中使用:
for( final String s : value ) {
doSomething( new InnerClass() {
void something() {
s.length();// accesing s from within the inner class
}
});
}发布于 2010-07-28 10:44:28
将循环变量声明为final纯粹是一种风格上的事情:
我个人认为这不是什么大事。但那是因为我从来没有写过这样的代码...没有添加一个大的大胆的评论来解释发生了什么,以及为什么我决定这样做。(但如果你所处的环境中,这种令人厌恶的事情是司空见惯的,我能理解这一点……)
我认为在
循环中指定的变量已经是只读的(例如,在上面的例子中不能给'str‘赋值)。
不是的。for循环变量(如果没有声明为final) 可以在循环体中进行修改。
如果您想了解细节,可以在JLS section 14.14中描述for循环。它没有明确提到声明为final的循环变量。但总体情况是,在for语句中定义的循环变量与任何其他变量之间的唯一区别是作用域。
发布于 2010-07-28 10:39:17
我认为在for循环中指定的变量已经是只读的
它不是只读的,试试看。
有些人喜欢将局部变量声明为'final',不知道为什么。看起来就是这样的情况。
在任何情况下,都不要把你在web上找到的任意代码样本当作样式模型。
https://stackoverflow.com/questions/3349458
复制相似问题