Вопрос с собеседования · Java

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

MiddleПаттерны проектирования
Ещё спрашивают так:
  • Что не так с 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?
  • Чем поверхностное копирование отличается от глубокого?
  • Нужно ли копировать по-настоящему неизменяемые объекты?

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования