3

当我将匿名内部类传递给函数时,我可以从该类的方法中引用当前范围内的变量,如下所示:

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);
    }
}

现在,在上面的 someMethod 运行之后,调用者和带有小匿名的队列可以分道扬镳,据我了解,JVM 保持所有引用正常,因此这始终有效。

但是,如果,例如,队列被序列化,程序关闭并重新启动,然后队列被反序列化并且其中的项目应该运行,而 Caller 实例早已消失并被遗忘,该怎么办?

还有其他方法可以让周围的对象和匿名内部类以一种在匿名类内部调用不再起作用的方式分离吗?

4

2 回答 2

6

不要序列化本地类,因为 (a) 文档是这样说的,并且 (b) 序列表示不稳定(它们一开始没有稳定的名称)。

如果您不希望您的实例为外部 this 和使用的 final 局部变量保留字段,请使用(静态)嵌套类或外部类。对于(Java)序列化,您可以使用writeReplace序列化串行代理对象。

于 2009-03-23T11:31:50.867 回答
2

不要忘记您的匿名内部类包含隐式this引用。即对周围类的引用。

所以如果你序列化你的内部类,就会有一个对你的外部类的引用。如果您使用XStream进行序列化并查看 XML 输出,您可以清楚地看到这一点。

于 2009-03-23T11:32:25.357 回答