Вопрос проверяет понимание механизма клонирования объектов в Java и его практического применения для создания копий объектов.
Метод clone() в Java предназначен для создания копии объекта. Он определен в классе Object и является защищенным (protected). Чтобы объект можно было клонировать, его класс должен реализовать интерфейс-маркер Cloneable. Если этого не сделать, при вызове clone() будет выброшено исключение CloneNotSupportedException.
По умолчанию реализация clone() в Object выполняет поверхностное копирование (shallow copy). Это означает, что копируются примитивные поля и ссылки на объекты, но сами объекты, на которые указывают ссылки, не дублируются. В результате оригинал и копия будут ссылаться на одни и те же вложенные объекты. Для глубокого копирования (deep copy) необходимо переопределить clone() и вручную клонировать все вложенные объекты.
class Address implements Cloneable {
String city;
Address(String city) { this.city = city; }
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // поверхностное копирование
}
}
class Person implements Cloneable {
String name;
Address address;
Person(String name, Address address) {
this.name = name;
this.address = address;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Person cloned = (Person) super.clone();
cloned.address = (Address) address.clone(); // глубокое копирование
return cloned;
}
}Метод clone() полезен для создания копий объектов, особенно в контексте паттерна Prototype или когда нужно избежать дорогостоящего создания объекта через конструктор. Однако из-за сложностей с глубоким копированием и потенциальных ошибок, многие разработчики предпочитают использовать копирующие конструкторы или фабричные методы, которые более прозрачны и безопасны.