2012-05-17 72 views
11

對不起,有一個新手問題,但是在java/android中複製/克隆對象的最佳方法是什麼?如何克隆android中的對象?

rlBodyDataObj rlbo = bdoTable.get(name); 

現在代碼一個Hashtable分配一個對象,但我需要得到它的一個克隆,使我能多次使用它。

謝謝!

+0

也許使用的clone()? –

+0

看看這個答案http://stackoverflow.com/questions/869033/how-do-i-copy-an-object-in-java –

+0

這是我的自定義對象,它沒有.clone() –

回答

16

確保您DataObj類實現了Cloneable並添加下面的方法

protected Object clone() throws CloneNotSupportedException { 
     return super.clone(); 
} 

那麼你應該能夠調用(DataObj)rlBodyDataObj.clone();得到一個乾淨的副本(注意演員)。

+0

是的!謝謝,它工作! :=) –

+0

嗯...不是真的,請參閱此問題:) http://stackoverflow.com/questions/10636673/android-cloned-object-also-clones-new-data-how-to-prevent-that –

+0

您不需要添加該方法。 – EJP

1

有時您需要在從clone()方法返回之前修改某些字段。

選中此項:http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#clone()。 我在這裏粘貼的有關部分爲了方便:

「按照慣例,此方法返回的對象應該是 獨立於此對象(被克隆的)來實現這一 獨立性,可能有必要在返回之前修改super.clone返回的對象的一個​​或多個字段,通常這個 表示複製包含被克隆對象的內部「deep 結構」的任何可變對象,並將這些對象的引用替換爲 參考副本如果一個類只包含 基本字段或引用immutabl e對象,那麼它通常是 這種情況,即super.clone 返回的對象中沒有字段需要修改。「

+0

謝謝。請看看這個http://stackoverflow.com/questions/10636673/android-cloned-object-also-clones-new-data-how-to-prevent-that,似乎它克隆了在.clone()發生了... –

5
class Test implements Cloneable 
    { 
    ... 
     public Object clone() 
     { 
      try 
     { 
       return super.clone(); 
      } 
     catch(CloneNotSupportedException e) 
     { 
       return null; 
      } 
     } 
    ... 
    } 
2

可以實現Parcelable(易於使用Studio插件),然後

public static <T extends Parcelable> T copy(T orig) { 
    Parcel p = Parcel.obtain(); 
    orig.writeToParcel(p, 0); 
    p.setDataPosition(0); 
    T copy = null; 
    try { 
     copy = (T) orig.getClass().getDeclaredConstructor(new Class[]{Parcel.class}).newInstance(p); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return copy; 
}