Java for语句中的Final关键字
我在阅读一些在网上找到的代码时,发现了以下几行代码(java):Java for语句中的Final关键字,java,Java,我在阅读一些在网上找到的代码时,发现了以下几行代码(java): 私有列表值; [...] for(最终字符串str:values){ 长度+=context.strlen(str); } 在for循环中声明变量final的优点是什么?我认为for循环中指定的变量已经是只读的(例如,在上面的示例中,无法为'str'赋值) Thx我认为for循环中指定的变量已经是只读的 它不是只读的,试试看 有些人喜欢将局部变量声明为“final”,不知道为什么。看来情况就是这样 在任何情况下,不要把你在网上找
私有列表值;
[...]
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纯粹是一种风格:
- 您可以保护自己,避免意外地向循环体添加更改循环变量的语句
- 您可以让阅读代码的其他人清楚地知道,循环变量不会在循环体中更改
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;
};
}