2015-05-15 83 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的引用不會強制您序列化該引用。