Java:带匿名class出门

Java: Take anonymous class outside

我的情况如下:

Class C1 {

    public static void main(String[] args) {
        Object o = // new object of some class
        delegate(new C2() {             // C2 is an abstract class or interface
            public void delegateLogic() {
                Object my_o = o;  // refrences main's local variable
                // huge method body
                // object o local to main is required here  
            }
        });
    }

    private void delegate(C2 c2) {
        // method body
    }
}

delegateLogic() 的主体变得非常大。对于代码可维护性:

  1. 我想从 C2 创建一个具体的 class 并将其保存在外部,同时仍然可以在 main 方法中使用对象 o。
  2. 此外,C2 的实例应该是可序列化的,不幸的是对象 o 是不可序列化的。所以,我不想通过在构造函数中传递对象 o 在 C2 中创建成员对象。

有什么想法吗?

如果你想让C2能够被序列化,只要将o声明为transient即可。但是,您需要接受这样一个事实,即 o 如果得到 serialized/deserialized 则将为空,除非您设法以某种方式手动序列化它。

public class X extends C2 {
    private transient Object o;

    public X(Object o) {
        this.o = o;
    }

    public void delegateLogic() {
        Object my_o = o;  // refrences main's local variable
        // huge method body
        // object o local to main is required here  
    }
}

如果 C2 成为外部 class,那么它必须以某种形式将对 o 的引用传递给它,以便在 delegateLogic 中使用它。您实际上只有 3 个选项可以让 o 进入您的 C2 实例:

  1. 在构造函数中传递它
  2. 使用setter方法
  3. 直接将其作为参数传递给delegateLogic

您选择哪一个取决于很多因素。

请注意,在 class 的成员变量中存储对 o 的引用不会强制您序列化该引用。