2011-12-12 47 views
2

可能重複:
How do I copy an object in Java?Java:傳入「this」的副本?

我已經在我的Claus類調​​用一個函數接受類型Claus有一個功能。我目前正在傳遞this作爲參數,但它正在編輯我不希望它做的類的當前實例。相反,我希望它克隆該類的當前實例並對其進行編輯,並將這些副本分開。我怎樣才能做到這一點?

編輯

也許我應該澄清我的問題遠一點......

我有一個對象,它是另一個對象內.. e.g Clausfloss。我一直在閱讀shallow copy vs deep copy,我想我的Claus正確複製。我正在做這樣的...

public Claus(Claus g){ 
    cla = new Floss(g.getFloss()); 
      //irrelevant other variables... 
    p = g.getP(); 
    c = g.getC(); 
} 

然而,我宣佈在構造完全相同的方式..這是內Claus功能....

cla = new Floss(g.getFloss()); 

其中cla = Floss變量和g = Claus這是傳遞給構造函數。 Floss對象似乎並不像它應該創建一個深層副本。這是爲什麼發生?

+1

您能提供代碼來說明您在做什麼嗎? – artdanil

+0

劑量克隆實施克隆?如果你通過克隆怎麼辦?你的描述本身沒有不好的代碼氣味,但可能是非常輕微的氣味。我想知道你是否在做錯事。也許你會更好地告訴我們你想要達到什麼樣的行爲,而不是你如何在代碼中實現它。 –

+5

男人就像在這裏克隆人的攻擊。 –

回答

4

實施Cloneable和使用this.clone(),就像任何其他變量。

1
Object objClone = obj.clone(); 

克隆將返回就像它的聲音,克隆你的對象。 Clone()是Object超類的一種方法,因此如果實現Cloneable接口,則所有對象都可以訪問此方法。

+2

僅當'obj'類型實現'Cloneable'時纔有效。否則,你會得到'CloneNotSupportedException'。 –

1
void foo(Claus c) 
{ 
} 

不是foo(this),做foo(new Claus(this))

編輯:

,然後定義克勞斯拷貝構造函數,像這樣:

public Claus(Claus c) 
{ 
    this.whatever = c.whatever; 
    // etc. 
} 
+0

我不認爲克勞斯的構造函數看起來像這樣。 – RoflcoptrException

+0

複製構造函數? –

+0

在Java中複製構造函數? – RoflcoptrException

3

考慮實施相關類的copy constructor。這是一個構造函數,它接受另一個相同類型的實例並將其狀態複製到新對象中。

1

您可能想要實施.clone()方法。但是,您必須確保它實現了Cloneable界面。

但它的建議更喜歡像拷貝構造函數靜態工廠方法,它接受一個對象作爲參數,並創建一個新的實例是這樣的傳遞對象的副本等方法。

但是,有一件事,你真的需要注意的是,僅僅一個所有字段的拷貝是否足夠或者你需要一個副本。因爲,如果您需要深度複製並創建對象的淺表副本,則可能意味着代碼中存在潛在的錯誤

1

你可以這樣做:

public class MyObject { 
    //attributes 
    private String attr1; 

    public MyObject() {} //first construct 

    public MyObject(MyObject obj) { 
     //do copy of all attributes 
     this.attr1 = obj.getAttr1(); 
    } 

    //setters and getters 

    public void method(MyObject obj) { 
     MyObject obj2 = new MyObject(obj); 
     //your processing 
    } 

} 

,並調用它

MyObject obj = new MyObject(); 
obj.setAttr1("someone"); 
obj.method(obj); 

希望這有助於..

-1

正如其他人所說,您應該實現clone()方法,或創建複製構造函數。

無論您選擇哪種解決方案,您都希望進行所謂的「深度複製」。如果對象很簡單,那麼創建深層副本很簡單。如果對象很複雜,一個技巧是序列化和反序列化對象。這將以最小的努力進行深層次的複製。

每當我這樣做,我喜歡用XStream而不是本地Java序列化。它將一個對象序列化爲XML,包括任何嵌套對象和集合,然後您可以反序列化以進行深層複製。以下代碼很可能適用於您的班級,無需任何修改:

public Claus clone(Claus source) { 
     XStream xstream = new XStream(); 
     String serializedObj = xstream.toXML(source); 
     return (Claus) xstream.fromXML(serializedObj); 
    }