java / androidでオブジェクトをコピー/クローンするための最良の方法は何でしょうか?
rlBodyDataObj rlbo = bdoTable.get(name);
現在、コードはhashTableからオブジェクトを割り当てていますが、それを複数回使用できるように、そのクローンを取得する必要があります。
DataObj クラスが Cloneable を実装していることを確認し、次のメソッドを追加します
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
次に、 (DataObj)rlBodyDataObj.clone(); を呼び出すことができるはずです。きれいなコピーを取得します (キャストに注意してください)。
class Test implements Cloneable
{
...
public Object clone()
{
try
{
return super.clone();
}
catch( CloneNotSupportedException e )
{
return null;
}
}
...
}
Parcelable を実装できます (スタジオ プラグインで簡単)。
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://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#clone ()。便宜上、関連する部分をここに貼り付けました。
「慣例により、このメソッドによって返されるオブジェクトは、このオブジェクト (複製される) から独立している必要があります。この独立性を実現するには、super.clone によって返されるオブジェクトを返す前に、1 つ以上のフィールドを変更する必要がある場合があります。通常、これは複製されるオブジェクトの内部の「深い構造」を構成する可変オブジェクトをコピーし、これらのオブジェクトへの参照をコピーへの参照に置き換えることを意味します。クラスにプリミティブ フィールドまたは不変オブジェクトへの参照のみが含まれる場合、それは通常、super.clone によって返されるオブジェクトのフィールドを変更する必要がない場合です。"