设计模式——Java:在外部使用匿名类



我遇到了如下情况:

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创建一个具体的类,并保持它在外面,同时仍然有一种方法在主方法中使用对象o。
  2. 同样,C2的实例应该是可序列化的,不幸的是对象0不是可序列化的。因此,我不想通过在构造函数中传递对象o来创建C2中的成员对象。

任何想法?

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

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

你选择哪一个取决于很多事情。

注意,在类的成员变量中存储对0的引用并不强制您序列化该引用。

如果您希望C2能够被序列化,只需将o声明为transient。然而,您需要接受这样一个事实:如果0被序列化/反序列化,它将为空,除非您设法以某种方式手动序列化它。

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

最新更新