在Android中如何克隆一个对象?

22

在Java/Android中,最好的复制/克隆对象的方法是什么?

rlBodyDataObj rlbo = bdoTable.get(name);

目前代码从一个哈希表中分配了一个对象,但我需要获取它的克隆版本,以便能够多次使用。


1
请查看这个答案https://dev59.com/eHNA5IYBdhLWcg3wrf43 - Brendan Cutajar
这是我的自定义对象,它没有 .clone() 方法。 - Roger Travis
1
@RogerTravis Java中的所有对象都有clone()方法,它们是从Object超类继承而来的。您可能需要覆盖此方法,以使其在您的自定义类中变得有用。 - Hunter McMillen
你不需要克隆它才能多次使用它。在我二十年的生产代码中,我从未使用过clone() - user207421
6个回答

24

确保您的 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 - Roger Travis
你不需要添加这个方法。 - user207421
将您的克隆实现公开,以便您可以在任何地方使用。 - Jorge Gil

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

6
您可以实现 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;
}

3
有时在从clone()方法返回之前需要修改一些字段。
请查看:http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#clone。 我为方便起见将相关部分粘贴在此处:
“按照惯例,此方法返回的对象应该独立于正在被克隆的对象。为了实现这种独立性,在返回它之前可能需要修改超级克隆对象的一个或多个字段。通常,这意味着复制组成被克隆对象的内部“深度结构”的任何可变对象,并用指向这些副本的引用替换对这些对象的引用。如果一个类只包含原始字段或不可变对象的引用,则通常情况下不需要修改由超级克隆返回的对象中的任何字段。”

请看这个链接:http://stackoverflow.com/questions/10636673/android-cloned-object-also-clones-new-data-how-to-prevent-that,似乎它会克隆在 .clone() 之后分配的集成对象。 - Roger Travis

1

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


1
我希望实现以下内容: 拷贝构造函数
class DataObj {
  private String tag;

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

每个对象都有一个克隆方法,可用于复制对象,但很容易创建类并使用不当的克隆方法。如果您要实现克隆方法,请至少阅读 Joshua Bloch 在 Effective Java 中的建议。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接