Java:在外面进行匿名课程

时间:2015-05-15 05:14:26

标签: java design-patterns anonymous-class

我的情况如下:

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创建一个具体的类并将其保留在外面,同时仍然可以在main方法中使用object o。
  2. 此外,C2的实例应该是可序列化的,遗憾的是对象o不可序列化。所以,我不想通过在构造函数中传递对象o来在C2中创建成员对象。
  3. 有什么想法吗?

2 个答案:

答案 0 :(得分:2)

如果C2成为外部类,那么它必须具有以某种形式传递给它的引用,以便在delegateLogic中使用它。你真的只有3个选项可以进入你的C2实例:

  1. 在构造函数中传递它
  2. 使用setter方法
  3. 直接将其作为参数传递给delegateLogic
  4. 您选择哪一项取决于很多事情。

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

答案 1 :(得分:1)

如果您希望C2能够被序列化,只需将o声明为瞬态。但是,如果它被序列化/反序列化,你将需要接受o为null的事实,除非你设法以某种方式手动序列化它。

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