繁体   English   中英

Java 中的匿名内部类有没有办法“丢失”他们的 scope?

[英]Is there a way for anonymous inner classes in Java to “lose” their scope?

当我将匿名内部 class 传递给 function 时,我可以在 scope 的方法中引用当前 scope 中的变量,如 ZCBB142F2ED29DCCAB21、so

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 运行之后,调用者和带有小匿名的队列可以 go 分开,据我了解,JVM 使所有引用保持正确,因此这始终有效。

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

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

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

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

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

因此,如果您序列化您的内部 class,将会引用您的外部 class。 如果您使用XStream进行序列化并查看 XML output,您可以清楚地看到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM