在 java/android 中复制/克隆对象的最佳方法是什么?
rlBodyDataObj rlbo = bdoTable.get(name);
现在代码从 hashTable 中分配一个对象,但我需要克隆它,这样我就可以多次使用它。
确保您的 DataObj 类实现 Cloneable 并添加以下方法
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
然后你应该可以调用 (DataObj)rlBodyDataObj.clone(); 得到一个干净的副本(注意演员表)。
class Test implements Cloneable
{
...
public Object clone()
{
try
{
return super.clone();
}
catch( CloneNotSupportedException e )
{
return null;
}
}
...
}
你可以实现 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;
}
有时您需要在从 clone() 方法返回之前修改一些字段。
检查这个:http ://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#clone ()。为方便起见,我在此处粘贴了相关部分:
“按照惯例,这个方法返回的对象应该独立于这个对象(正在被克隆)。为了实现这种独立性,可能需要在返回之前修改 super.clone 返回的对象的一个或多个字段。通常,这意味着复制任何包含被克隆对象的内部“深层结构”的可变对象,并将对这些对象的引用替换为对副本的引用。如果一个类仅包含原始字段或对不可变对象的引用,那么它是通常情况下 super.clone 返回的对象中没有字段需要修改。”
我希望实现: 复制构造函数
class DataObj {
private String tag;
public DataObj(DataObj another) {
this.tag= another.tag; // you can access
...
}
}
每个对象都有一个可以用来复制对象的克隆方法,但是创建一个类并使用不正确的克隆方法太容易了。如果您打算使用实现克隆方法,请至少阅读 Joshua Bloch 在Effective Java中对它所说的内容。
您必须在您的类上指定它实现Cloneable接口,并且您必须覆盖clone
该类中的方法。默认情况下,它将使用类clone
的方法Object
。