Мне интересно, есть ли рекомендуемый способ сделать глубокий клон / копию экземпляра в java.
У меня есть 3 решения, но я могу пропустить некоторые, и я бы хотелВаше мнение
редактировать: включить проповедь Богзо и уточнить вопрос: это больше о глубоком клонировании, чем мелком клонировании.
Сделай сам:
закодируй свойства клона вручную послесвойства и проверьте, что изменяемые экземпляры тоже клонируются.
pro:
- контроль над тем, что будет выполнено
- быстрое выполнение
cons:
- утомительно писать и поддерживать
- подвержены ошибкам (ошибка копирования / вставки, отсутствующее свойство, переназначенное изменяемое свойство)
Использовать отражение:
С вашими собственными инструментами отражения или с внешнимпомощник (например, Jakarta Common-Beans) легко написать общий метод копирования, который будет выполнять работу в одну строку.
pro:
- легко писать
- не требует обслуживания
минусы:
- минус продолжениеЧто происходит
- ошибка подвержена изменчивому объекту, если инструмент отражения тоже не клонирует подобъекты
- медленное выполнение
Использовать платформу клонирования:
Использовать платформу, которая делаетэто для вас, например:
Commons-lang SerializationUtils
Java Deep Cloning Library
Dozer
Kryo
pro:
- аналогично отражению
- больше контроля над тем, что именно будет клонировано.
минусы:
- каждый изменяемый экземпляр полностью клонируется, даже в конце иерархии
- может выполняться очень медленно
Использовать инструментарий байт-кода для записи клона во время выполнения
javassit, BCEL или cglib могут быть использованы для генерации выделенного клонера так же быстро, как написана одна рука.Кто-то знает библиотеку, использующую один из этих инструментов для этой цели?
Что я здесь пропустил?
Какой из них вы бы порекомендовали?
Спасибо.