Han*_*etz 3 java closures inner-classes
当我将一个匿名内部类传递给一个函数时,我可以从该类的方法中引用当前作用域中的变量,如下所示:
class Caller {
private Object callerPrivate;
// ...
public void someMethod() {
final String callerLocal = "Eyes only";
ISomeInterface anon = new ISomeInterface() {
public void doSomethingInterfacy {
System.out.println(callerPrivate.toString());
System.out.println(callerLocal);
}
};
// this is some other object that puts ISomeInterfaces in a queue
// and makes them doSomethingInterfacy later
myCallManager.enqueue(anon);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在上面的someMethod运行之后,调用者和带有小动画的队列可以分开,并且据我所知,JVM保持所有引用都是直的,这样总是有效.
但是,例如,如果队列被序列化,程序关闭并重新启动,然后队列被反序列化并且其中的项目将被运行,并且调用者实例很久就被遗忘了?
还有其他方法可以让周围的对象和匿名的内部类以一种在anon类内部调用的方式不再分离的方式分开吗?
不要序列化本地类,因为(a)文档说明这一点,(b)序列表示不稳定(它们没有稳定的起始名称).
如果您不希望实例保留外部字段和使用的最终本地字段,请使用(静态)嵌套类或外部类.对于(Java)序列化,您可以使用writeReplace序列化代理对象.