Как реализовано глубокое клонирование в java
Ответы
Иван Полежаев
13 апреля 2023
В Java
глубокое клонирование можно реализовать двумя способами:
1 Реализовать интерфейс Cloneable
и переопределить метод clone()
.
При этом, необходимо скопировать все поля объекта и рекурсивно клонировать все объекты, которые содержатся в этом объекте.
Например:
public class MyClass implements Cloneable {
private int x;
private String str;
private MyOtherClass obj;
// constructors, getters, and setters
@Override
public Object clone() throws CloneNotSupportedException {
MyClass cloned = (MyClass) super.clone();
cloned.obj = (MyOtherClass) obj.clone();
return cloned;
}
}
public class MyOtherClass implements Cloneable {
private int y;
private String str2;
// constructors, getters, and setters
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
2 Использовать механизм сериализации объектов.
Для этого объект необходимо сериализовать в байтовый поток, а затем десериализовать обратно в объект. При десериализации создается новый объект с теми же полями и значениями, что и у исходного объекта.
Пример:
public class MyClass implements Serializable {
private int x;
private String str;
private MyOtherClass obj;
// constructors, getters, and setters
public MyClass deepCopy() throws IOException, ClassNotFoundException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return (MyClass) ois.readObject();
}
}
public class MyOtherClass implements Serializable {
private int y;
private String str2;
// constructors, getters, and setters
}
Оба способа имеют свои преимущества и недостатки, но использование механизма сериализации может быть медленнее и менее эффективным, чем использование метода clone()
1
0