问题:怎么样实现对一个对象的深拷贝
使用深拷贝的方法有点难实现啊。要保证原来的对象和克隆对象不是共享同一个引用的步骤是什么啊?
回答一
一种安全的方法是先序列化对象,然后反序列化。这保证了所有东西都是一个新的引用。
这里有一篇关于如何高效实现这个的文章。
注意:类可能会重写序列化的方法,这样就不会创建新的实例,例如对于单例来说,如果你的类不是可序列化的,这当然也不会生效啦。
回答二
实现深拷贝的一种方法是向每个关联的类添加复制构造函数。一个复制构造函数接受’this’的一个实例作为其单个参数,并从这个实例中复制所有值。这函数要干非常多的工作,但是也是非常直接和安全。
编辑:注意你不需要使用访问方法来读取属性。你可以直接访问所有属性,因为源实例总是与具有复制构造函数的实例具有相同的类型。这是很明显的,但可能会被忽视了。
例子:
public class Order {private long number;public Order() {}/*** Copy constructor*/public Order(Order source) {number = source.number;}
}public class Customer {private String name;private List<Order> orders = new ArrayList<Order>();public Customer() {}/*** Copy constructor*/public Customer(Customer source) {name = source.name;for (Order sourceOrder : source.orders) {orders.add(new Order(sourceOrder));}}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
注意,如果复制构造函数的话,你需要知道你复制的那个对象运行的时候是什么类型的。所以上面的方法,你不能简单第用来复制一个混合类型的list(你要用一些反射的代码去完成)
文章翻译自Stack Overflow:https://stackoverflow.com/questions/64036/how-do-you-make-a-deep-copy-of-an-object