Нет встроенного метода в Java, позволяющего сделать глубокую копию для коллекции по простой причине: определение глубокой копии зависит от класса.
Ни один служебный метод не может угадать это и полагаясь на Cloneable
, чтоне рекомендуемый интерфейс не будет хорошей идеей.
Так что вы должны выполнить эту задачу самостоятельно.
Вы можете сделать вещи более универсальными, представив интерфейс, который определяет метод копирования, который реализует каждый класс для глубокого копирования.
Например:
public interface Copyable<T> {
T copy();
}
И реализовать его, например:
public class Foo implements Copyable<Foo> {
public Foo copy(){
Foo foo = new Foo();
// deep copy values in foo
return foo;
}
}
И вы можете ввести метод static
в Copyable
для выполнения глубокого копирования коллекции:
public static <T extends Copyable<T>> List<T> deepCopyToList(Collection<T> collection) {
return collection.stream()
.map(Copyable::copy)
.collect(Collectors.toList());
}
И использовать его следующим образом:
List<Foo> foos = new ...;
List<Foo> fooCopies = Copyable.deepCopyToList(foos);
Где Foo
реализует Copyable
.