對不起,有一個新手問題,但是在java/android中複製/克隆對象的最佳方法是什麼?如何克隆android中的對象?
rlBodyDataObj rlbo = bdoTable.get(name);
現在代碼一個Hashtable分配一個對象,但我需要得到它的一個克隆,使我能多次使用它。
謝謝!
對不起,有一個新手問題,但是在java/android中複製/克隆對象的最佳方法是什麼?如何克隆android中的對象?
rlBodyDataObj rlbo = bdoTable.get(name);
現在代碼一個Hashtable分配一個對象,但我需要得到它的一個克隆,使我能多次使用它。
謝謝!
確保您DataObj類實現了Cloneable並添加下面的方法
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
那麼你應該能夠調用(DataObj)rlBodyDataObj.clone();得到一個乾淨的副本(注意演員)。
是的!謝謝,它工作! :=) –
嗯...不是真的,請參閱此問題:) http://stackoverflow.com/questions/10636673/android-cloned-object-also-clones-new-data-how-to-prevent-that –
您不需要添加該方法。 – EJP
有時您需要在從clone()方法返回之前修改某些字段。
選中此項:http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#clone()。 我在這裏粘貼的有關部分爲了方便:
「按照慣例,此方法返回的對象應該是 獨立於此對象(被克隆的)來實現這一 獨立性,可能有必要在返回之前修改super.clone返回的對象的一個或多個字段,通常這個 表示複製包含被克隆對象的內部「deep 結構」的任何可變對象,並將這些對象的引用替換爲 參考副本如果一個類只包含 基本字段或引用immutabl e對象,那麼它通常是 這種情況,即super.clone 返回的對象中沒有字段需要修改。「
謝謝。請看看這個http://stackoverflow.com/questions/10636673/android-cloned-object-also-clones-new-data-how-to-prevent-that,似乎它克隆了在.clone()發生了... –
class Test implements Cloneable
{
...
public Object clone()
{
try
{
return super.clone();
}
catch(CloneNotSupportedException e)
{
return null;
}
}
...
}
可以實現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;
}
也許使用的clone()? –
看看這個答案http://stackoverflow.com/questions/869033/how-do-i-copy-an-object-in-java –
這是我的自定義對象,它沒有.clone() –