Ответ
Конструктор копирования (Copy Constructor) — это специальный конструктор класса, который принимает в качестве параметра объект этого же класса и инициализирует новый создаваемый объект, копируя состояние (значения полей) из переданного объекта.
Пример реализации:
public class Person {
private String name;
private int age;
private Address address; // Изменяемый (mutable) объект
// Обычный конструктор
public Person(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
// Конструктор копирования (ПОВЕРХНОСТНАЯ копия - shallow copy)
public Person(Person original) {
this.name = original.name;
this.age = original.age;
this.address = original.address; // Копируется ссылка, не объект!
}
// Конструктор копирования (ГЛУБОКАЯ копия - deep copy)
public Person(Person original) {
this.name = original.name;
this.age = original.age;
// Создаём новый объект Address, копируя его поля
this.address = new Address(original.address.getStreet(), original.address.getCity());
}
}
// Использование
Person original = new Person("Alice", 30, new Address("Main St", "Boston"));
Person copy = new Person(original); // Создаётся новый объект Person
| Сравнение с другими способами копирования: | Способ | Механизм | Глубина копии | Плюсы | Минусы |
|---|---|---|---|---|---|
| Конструктор копирования | Вызов конструктора | Зависит от реализации (часто shallow) | Полный контроль, не требует Cloneable |
Нужно писать код для каждого класса | |
Клонирование (clone()) |
Реализация интерфейса Cloneable |
По умолчанию shallow, можно переопределить | Стандартный механизм | Сложная корректная реализация, CloneNotSupportedException |
|
Присваивание (=) |
Копирование ссылки | Нет копии объекта | Просто | Создаётся вторая ссылка на тот же объект |
Когда использовать:
- Для создания независимой копии изменяемого (mutable) объекта.
- Когда нужен больший контроль над процессом копирования, чем предоставляет
clone(). - Для реализации неизменяемых (immutable) объектов, которые могут принимать данные из существующих.