問題:怎么樣實現對一個對象的深拷貝
使用深拷貝的方法有點難實現啊。要保證原來的對象和克隆對象不是共享同一個引用的步驟是什么啊?
回答一
一種安全的方法是先序列化對象,然后反序列化。這保證了所有東西都是一個新的引用。
這里有一篇關于如何高效實現這個的文章。
注意:類可能會重寫序列化的方法,這樣就不會創建新的實例,例如對于單例來說,如果你的類不是可序列化的,這當然也不會生效啦。
回答二
實現深拷貝的一種方法是向每個關聯的類添加復制構造函數。一個復制構造函數接受’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