Чем поверхностное копирование отличается от глубокого и как правильно копировать объекты в современной Java?
- Что не так с Cloneable и Object.clone()?
- Что верно про Cloneable и Object.clone() в Java?
Поверхностная копия копирует значения полей — то есть ссылки: вложенный изменяемый список общий у оригинала и копии. Глубокая — копирует весь граф. clone() — неудачный дизайн: маркерный Cloneable без метода, protected clone, обход конструктора, несовместимость с final-полями. Используют копирующий конструктор или фабрику.
- Неизменяемые поля копировать не нужно — их можно разделять
- Коллекции: List.copyOf, new ArrayList<>(other)
- Массивы — clone() для них нормален
А ещё Глубокая копия через сериализацию — медленно и хрупко
Подробно
Начни с разницы и покажи последствие: у поверхностной копии изменяемый список внутри — тот же самый объект, что и в оригинале, поэтому правка через копию видна в оригинале. Разбери, почему clone() считают ошибкой дизайна: маркерный интерфейс без метода, protected-видимость, обход конструктора, поверхностность по умолчанию. Назови рекомендацию Блоха — копирующий конструктор или фабрика — и упомяни, что способы глубокого копирования через сериализацию медленные и хрупкие. Сильное завершение: для неизменяемых объектов копирование не нужно, их можно разделять.
Что хотят услышать
- Различие и его последствия.
- Претензии к clone.
- Копирующий конструктор и неизменяемость как альтернатива.
Частые ошибки
- Считать, что clone() делает глубокую копию.
- Предлагать сериализацию как основной способ глубокого копирования.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Поверхностная копирует только примитивы, а ссылочные поля обнуляет
- ✗Глубокая копия — это clone(): он всегда копирует весь граф объектов
- ✓Поверхностная копирует ссылки на вложенные объекты; копируют конструктором или фабрикой, а не clone()
- ✗Разницы нет, если класс реализует Cloneable
Что спросят дальше
- Как сделать защитное копирование в конструкторе неизменяемого класса?
- Что такое Flyweight и где он есть в JDK?
- Чем поверхностное копирование отличается от глубокого?
- Нужно ли копировать по-настоящему неизменяемые объекты?
Разбор темы
- Порождающие паттерны
Factory Method против статической фабрики Блоха, Abstract Factory, Builder в двух версиях, Prototype и почему clone() считают ошибкой, object pool — с примерами из JDK и Spring.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.