在java / android中复制/克隆对象的最佳方法是什么?
rlBodyDataObj rlbo = bdoTable.get(name);
现在代码从hashTable中分配一个对象,但我需要克隆它,这样我就可以多次使用它了。
答案 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 中所说的内容。