Будет ли состояние клонированного объекта таким же как у оригинала в Java
Что проверяют
Понимаете ли вы, что делает Object.clone() на самом деле: копирует поля один в один, а для ссылок это означает общий объект. Следом спрашивают, как сделать глубокую копию и почему Cloneable считают неудачным API.
Как отвечать
Короткий ответ: сразу после клонирования состояние одинаковое, а вот насколько клон независим, зависит от реализации.
Стандартный super.clone() создаёт новый объект того же класса без вызова конструктора и копирует все поля как есть:
- примитивы: копируются значения, дальше клон и оригинал живут отдельно;
- ссылки на неизменяемые объекты (
String,Integer,LocalDate): формально общие, но это безопасно, изменить их нельзя; - ссылки на изменяемые объекты (массивы,
List,Date, свои классы): общие. Вызовclone.items.add(x)виден и в оригинале.
Такая копия называется поверхностной. Для глубокой изменяемые поля копируют отдельно: массив через array.clone(), коллекцию через new ArrayList<>(list), вложенные объекты рекурсивно.
Про механику: Cloneable это маркерный интерфейс без методов, а clone() объявлен в Object как protected. Без Cloneable вызов super.clone() бросает CloneNotSupportedException. Обычно метод переопределяют как public, с ковариантным типом возврата и без checked-исключения.
Покажите, что знаете альтернативы, которые советует и Джошуа Блох в Effective Java: копирующий конструктор или статическая фабрика вроде copyOf(). Ещё проще сделать объект неизменяемым, например record с неизменяемыми коллекциями, тогда копировать его вообще не нужно.
Где спотыкаются
Говорят, что clone() по умолчанию делает глубокую копию. Он поверхностный, и именно отсюда берутся баги, когда клон «портит» оригинал.
Пытаются заменить в клоне final-поле на копию. Присвоить final-поле внутри clone() нельзя, и это одна из причин предпочесть копирующий конструктор.
Предлагают глубокое копирование через сериализацию как универсальный рецепт. Это медленно, требует Serializable от всего графа объектов и тянет риски десериализации. Для реальной задачи лучше явное копирование.