当您final
从匿名类访问变量时,编译器会将其值秘密地复制到匿名类的成员变量中.例如:
Runnable foo() {
final int x = 42;
return new Runnable() {
void run() {
System.out.writeln(x);
}
};
}
Run Code Online (Sandbox Code Playgroud)
变为:
// the actual name is generally illegal in normal java syntax
class internal_Runnable implements Runnable {
final int x;
internal_Runnable(int _x) { x = _x; }
void run() {
System.out.writeln(x);
}
}
void foo() {
final x = 42;
return new internal_Runnable(x);
}
Run Code Online (Sandbox Code Playgroud)
如果变量不是final并且允许更改,则匿名类实例中缓存的值可能会不同步.这可以通过使用闭包来避免 - 也就是说,一个包含所有局部变量值的对象,原始函数和新的匿名类实例都可以访问.例如,.NET使用闭包.但是,这可能会导致性能损失,也许正是因为这个原因,Java语言设计者决定不支持完全关闭.
归档时间: |
|
查看次数: |
2148 次 |
最近记录: |