代码之家  ›  专栏  ›  技术社区  ›  James McMahon

有没有一种方法让Java中的匿名内部类“失去”它们的作用域?

  •  3
  • James McMahon  · 技术社区  · 16 年前

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

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

    现在,在运行了上面的某个方法之后,调用者和带有小anon的队列可以分开,据我所知,jvm保持所有引用是直的,这样就可以一直工作。

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

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

    2 回复  |  直到 16 年前
        1
  •  6
  •   Tom Hawtin - tackline    16 年前

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

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

        2
  •  2
  •   Brian Agnew    16 年前

    不要忘记匿名内部类包含一个隐式 参考文献。即对周围班级的参考。

    所以如果你将你的内类串联起来,就会有一个对外类的引用。如果使用 XStream 并查看XML输出。