当您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 次 |
| 最近记录: |