Одним из способов реализации глубокого копирования является добавление конструкторов копирования в каждый связанный класс. Конструктор копирования принимает экземпляр 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;
}
}
Редактировать: обратите внимание, что при использовании конструкторов копирования вам необходимо знать тип времени выполнения объекта, который вы копируете. При описанном выше подходе вы не можете легко скопировать смешанный список (вы можете сделать это с помощью некоторого кода отражения).