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 返回的对象的一个​​或多个字段。通常,这意味着复制任何包含被克隆对象的内部“深层结构”的可变对象,并将对这些对象的引用替换为对副本的引用。如果一个类仅包含原始字段或对不可变对象的引用,那么它是通常情况下 super.clone 返回的对象中没有字段需要修改。”

于 2012-05-17T13:32:43.960 回答
1

我希望实现: 复制构造函数

class DataObj {
  private String tag;

  public DataObj(DataObj another) {
    this.tag= another.tag; // you can access  
    ...
  }
}

每个对象都有一个可以用来复制对象的克隆方法,但是创建一个类并使用不正确的克隆方法太容易了。如果您打算使用实现克隆方法,请至少阅读 Joshua Bloch 在Effective Java中对它所说的内容。

于 2019-02-13T16:52:16.847 回答
1

您必须在您的类上指定它实现Cloneable接口,并且您必须覆盖clone该类中的方法。默认情况下,它将使用类clone的方法Object

于 2019-03-10T09:09:54.373 回答