Получить доступ

Чем поверхностное копирование отличается от глубокого и как правильно копировать объекты в современной Java?

MiddleПаттерны проектирования
Ещё спрашивают так:
  • Что не так с Cloneable и Object.clone()?
  • Что верно про Cloneable и Object.clone() в Java?
Коротко

Поверхностная копия копирует значения полей — то есть ссылки: вложенный изменяемый список общий у оригинала и копии. Глубокая — копирует весь граф. clone() — неудачный дизайн: маркерный Cloneable без метода, protected clone, обход конструктора, несовместимость с final-полями. Используют копирующий конструктор или фабрику.

  • Неизменяемые поля копировать не нужно — их можно разделять
  • Коллекции: List.copyOf, new ArrayList<>(other)
  • Массивы — clone() для них нормален

А ещё Глубокая копия через сериализацию — медленно и хрупко

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Начни с разницы и покажи последствие: у поверхностной копии изменяемый список внутри — тот же самый объект, что и в оригинале, поэтому правка через копию видна в оригинале. Разбери, почему clone() считают ошибкой дизайна: маркерный интерфейс без метода, protected-видимость, обход конструктора, поверхностность по умолчанию. Назови рекомендацию Блоха — копирующий конструктор или фабрика — и упомяни, что способы глубокого копирования через сериализацию медленные и хрупкие. Сильное завершение: для неизменяемых объектов копирование не нужно, их можно разделять.

Что хотят услышать

  • Различие и его последствия.
  • Претензии к clone.
  • Копирующий конструктор и неизменяемость как альтернатива.

Частые ошибки

  • Считать, что clone() делает глубокую копию.
  • Предлагать сериализацию как основной способ глубокого копирования.

Что спросят дальше

  • Как сделать защитное копирование в конструкторе неизменяемого класса?
  • Что такое Flyweight и где он есть в JDK?
  • Чем поверхностное копирование отличается от глубокого?
  • Нужно ли копировать по-настоящему неизменяемые объекты?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем