如何克隆android中的对象?

时间:2012-05-17 12:32:05

标签: java android

在java / android中复制/克隆对象的最佳方法是什么?

rlBodyDataObj rlbo = bdoTable.get(name);

现在代码从hashTable中分配一个对象,但我需要克隆它,这样我就可以多次使用它了。

6 个答案:

答案 0 :(得分:20)

确保您的DataObj类实现Cloneable并添加以下方法

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

然后你应该能够调用(DataObj)rlBodyDataObj.clone();得到一个干净的副本(注意演员)。

答案 1 :(得分:10)

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

答案 2 :(得分:5)

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

答案 3 :(得分:3)

有时您需要在从clone()方法返回之前修改某些字段。

检查一下:http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#clone()。 为方便起见,我在这里粘贴了相关部分:

  

“按照惯例,此方法返回的对象应该是   独立于此对象(正在克隆)。为达到这个   独立性,可能有必要修改一个或多个字段   super.clone返回之前返回的对象。通常,这   意味着复制任何包含内部“深层”的可变对象   结构“克隆的对象并替换引用   这些对象引用了副本。如果一个类只包含   原始字段或对不可变对象的引用,然后它   通常情况下,super.clone返回的对象中没有字段   需要修改。“

答案 4 :(得分:1)

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

答案 5 :(得分:0)

我希望通过以下方式实施: 复制构造函数

class DataObj {
  private String tag;

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

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