21

java / androidでオブジェクトをコピー/クローンするための最良の方法は何でしょうか?

rlBodyDataObj rlbo = bdoTable.get(name);

現在、コードはhashTableからオブジェクトを割り当てていますが、それを複数回使用できるように、そのクローンを取得する必要があります。

4

6 に答える 6

24

DataObj クラスが Cloneable を実装していることを確認し、次のメソッドを追加します

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

次に、 (DataObj)rlBodyDataObj.clone(); を呼び出すことができるはずです。きれいなコピーを取得します (キャストに注意してください)。

于 2012-05-17T12:41:27.147 に答える
11
class Test implements Cloneable
  {
   ...
      public Object clone()
      {
          try
      {
              return super.clone();
          }
      catch( CloneNotSupportedException e )
      {
              return null;
          }
      } 
  ...
  }
于 2015-08-05T13:00:57.670 に答える
6

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;
}
于 2017-04-14T17:04:35.607 に答える
3

clone() メソッドから戻る前に、いくつかのフィールドを変更する必要がある場合があります。

これを確認してください:http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#clone ()。便宜上、関連する部分をここに貼り付けました。

「慣例により、このメソッドによって返されるオブジェクトは、このオブジェクト (複製される) から独立している必要があります。この独立性を実現するには、super.clone によって返されるオブジェクトを返す前に、1 つ以上のフィールドを変更する必要がある場合があります。通常、これは複製されるオブジェクトの内部の「深い構造」を構成する可変オブジェクトをコピーし、これらのオブジェクトへの参照をコピーへの参照に置き換えることを意味します。クラスにプリミティブ フィールドまたは不変オブジェクトへの参照のみが含まれる場合、それは通常、super.clone によって返されるオブジェクトのフィールドを変更する必要がない場合です。"

于 2012-05-17T13:32:43.960 に答える