Реализовать функцию глубокого копирования объекта немного сложно. Какие шаги вы предпринимаете, чтобы гарантировать, что исходный объект и клонированный объект не имеют общих ссылок?
Переведено автоматически
Ответ 1
Безопасный способ - сериализовать объект, а затем десериализовать. Это гарантирует, что все будет совершенно новой ссылкой.
Предостережения: Классы могут переопределять сериализацию таким образом, что новые экземпляры не создаются, например, для одиночек. Также это, конечно, не сработает, если ваши классы не сериализуемы.
Ответ 2
Несколько человек упоминали об использовании или переопределении Object.clone(). Не делайте этого. Object.clone() имеет несколько серьезных проблем, и в большинстве случаев его использование не рекомендуется. Пожалуйста, ознакомьтесь с пунктом 11 из "Эффективной Java" Джошуа Блоха для получения полного ответа. Я считаю, что вы можете безопасно использовать Object.clone() для массивов примитивного типа, но помимо этого вам нужно быть разумным в отношении правильного использования и переопределения clone.
Схемы, основанные на сериализации (XML или иной), сложны.
Здесь нет простого ответа. Если вы хотите выполнить глубокое копирование объекта, вам придется пройти по графу объектов и явно скопировать каждый дочерний объект с помощью конструктора копирования объекта или статического фабричного метода, который, в свою очередь, глубоко копирует дочерний объект. Неизменяемые объекты (например, Strings) копировать не нужно. Кроме того, по этой причине вы должны отдавать предпочтение неизменяемости.
Ответ 3
Вы можете создать глубокую копию с сериализацией без создания файлов.
Ваш объект, который вы хотите скопировать, должен будет сделать это implement serializable. Если класс не является окончательным или не может быть изменен, расширьте класс и реализуйте serializable .