2015-05-15 86 views
1

我有一个情况介绍如下:的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的实例应该是可序列化的,不幸的是,对象o不可序列化。所以,我不想通过在构造函数中传递object o来在C2中创建一个成员对象。

任何想法?

+1

如果你想使这个序列化,你必须找到一些方法来以可序列化的形式至少捕获'o'的相关部分。 – Thilo

+0

另外,我无法控制o的类(可能的类)的定义。 – Mohitt

+0

你可以制作一个静态字段吗? –

回答

1

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

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

如果C2变成外部类则它必须具有参考邻传递给它以某种形式在delegateLogic使用它。你真的只有3个选项,让Ø到您的C2例如:

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

哪你选择这些取决于很多事情。

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