Как я могу скопировать объект в Java? - PullRequest
1 голос
/ 30 июня 2010

Я искал вокруг и видел несколько советов, но все еще не мог найти решение моей проблемы: мне нужно ВЕРНО скопировать существующий объект Java вместо создания ссылки на существующий. У меня нет доступа к классу, и он реализует метод клона через родительский класс, который фактически создает ссылку. Я попытался пойти по пути «сериализации / десериализации», он работал до некоторой степени, но копия НЕ точно совпадает с оригинальной. Можно ли это сделать вообще? Заранее спасибо!

David

Ответы [ 2 ]

2 голосов
/ 30 июня 2010

В общем случае вы не должны и не можете.

Почему вы не должны:

Существуют объекты, которые не следует клонировать - особенно.те, которые ссылаются на ресурсы вне контроля вашего программного обеспечения - их дублирование может вызвать хаос.

Почему вы не можете:

Сериализация и десериализация будут работать, только если все объекты, на которые ссылается клонируемый объект, являются сериализуемыми.

Вы можете написать некоторый код, который использует отражение для создания глубокого клонирования, создав новые объекты и рекурсивно клонировав все поля, однако попробуйте реализовать метод, который может глубоко клонировать этот объект:

public class Evil {
    public Evil() {
        throw new RuntimeException();
    }
}

Суть в том, что, если я не ошибаюсь, клонирование с помощью отражения неизменно зависит от вызова конструкторов с помощью Reflection, и конструкторы не гарантированно работают.

Однако в большинстве случаевэтот подход клонирует большинство объектов.Но вы все равно не должны этого делать!Я не могу придумать подходящий сценарий для этого.

edit: также, поскольку некоторые комментаторы отметили, что "точная копия" довольно плохо определена.

edit 2: заключение: толькокласс может знать, должно ли оно быть клонируемым и как это сделать.

1 голос
/ 30 июня 2010

Попробуйте библиотеку глубокого клонирования Java

Cloner cloner = new Cloner();
cloner.deepClone(object);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...