2010-09-19 162 views
1

對我而言,問題在於爲對象實現克隆。這個對象A的成員對象B不是由A創建的。我想克隆A,使得只有在構造A時創建的對象才能被克隆。這些對象或者作爲A或A的對象中的引用傳遞,或者A的對象的對象不被克隆。他們應該只被引用。Java中的深度克隆 - 僅克隆正在構建的對象

這可能嗎?我已經通過了一些深層克隆庫源碼(deep - cloner);他們似乎無法做出區分。我不能做序列化反序列化,因爲我懷疑它不會解決我的情況。另外,我必須克隆的對象A非常複雜。我涉及項目中的幾乎所有課程。 Apache系列化應用程序是否處理上述情況?

回答

2

這是不可能的。基本上,Java中沒有任何東西可以讓你確定何時給定的對象被創建。

如果對象A能夠保存它在其構造函數中創建的成員對象的記錄,那麼您將能夠獲得此問題的唯一方法是。

1

您將需要手動實施A.clone(),以便它只克隆要克隆的對象。的Object.clone默認的實現是執行一個淺拷貝操作,所以你需要做這樣的事情:

public class A implements Cloneable { 

    [...] 
    public Object clone() { 
     Object obj = null; 

     try { 
      obj = super.clone(); 
      // super.clone performs a "shallow copy" operation. 
      // Now you will need to manually clone any objects for 
      // which a "deep copy" operation is desired, e.g. 
      // 
      // obj.memberX = memberX.clone(); 
      // obj.memberY = memberY.clone(); 
      // ... 
      // 
     } catch (CloneNotSupportedException ex) { 
      // Should not happen.. 
     } 
     return obj; 
    } 
} 

這是假設你知道你想克隆出哪些對象(即哪些對象在那裏建設的過程中產生)。