【发布时间】:2010-07-17 11:28:20
【问题描述】:
【问题讨论】:
标签: java
【问题讨论】:
标签: java
使用“final”关键字使您声明的变量不可变。一旦最初分配,就不能重新分配。
但是,这并不一定意味着被变量引用的实例的状态是不可变的,只有引用本身是不可变的。
在变量上使用“final”关键字有几个原因。一种是优化,通过将变量声明为 final 允许值为memoized。
使用 final 变量的另一种情况是方法中的内部类需要访问声明方法中的变量。以下代码说明了这一点:
public void foo() {
final int x = 1;
new Runnable() {
@Override
public void run() {
int i = x;
}
};
}
如果 x 未声明为“final”,则代码将导致编译错误。需要“最终”的确切原因是因为新类实例可以比方法调用更长寿,因此需要它自己的 x 实例。为了避免一个可变变量在同一个作用域内有多个副本,该变量必须声明为final,这样它就不能被改变。
一些程序员还提倡使用“final”来防止意外地将变量重新分配到不应该出现的位置。有点像“最佳实践”类型的规则。
【讨论】:
final 防止意外更改的另一种用法:
public String foo(int a) {
final String s;
switch(a) {
case 0:
s="zero";
break;
case 1:
s="one";
//forgot break;
default:
s="some number";
}
return s;
}
这不会编译,因为如果 a==1,s 将被分配两次,因为缺少中断。 Final 可以帮助处理讨厌的 switch 语句。
【讨论】:
最终变量不能重新分配。如果它们是类或实例范围的,则必须在构造对象时分配它们。一种用途:您不希望其他人使用您更改的常量,例如string 或 int 常量(尽管枚举在 1.5+ 中做得更好)。此外,如果您想从您在该方法中定义的匿名方法引用方法范围变量,它必须是最终的,因此 Java 不必处理如果您的代码稍后重新分配该变量会发生什么,在它创建之后内部匿名方法的本地堆栈框架/范围。有人谈到在 Java 7 中包含某种形式的闭包可能会避免这种限制。
我的术语可能有点搞砸了——抱歉!但这是一般的想法。
【讨论】:
它声明了一个一旦初始化就不能修改的变量。有点只读。
【讨论】: