Мне интересно, есть ли рекомендуемый способ сделать глубокий клон/копию экземпляра в java.
У меня есть 3 решения, но я могу пропустить их, и я хотел бы получить ваше мнение
edit: включить Bohzo offerтон и уточнить вопрос: это больше о глубоком клонировании, чем мелкое клонирование.
Сделайте это самостоятельно:
закодируйте клон по свойствам вручную после свойств и проверьте, что клонируемые экземпляры тоже клонированы.
про:
- контроль над тем, что будет выполнено
- быстрое выполнение
минусы:
- утомительно писать и поддерживать
- ошибка (ошибка копирования/вставки, отсутствие свойства, переназначенное изменяемое свойство)
Использовать отражение:
С помощью собственных инструментов отражения или внешнего помощника (например, jakarta common- beans) легко написать общий метод копирования, который будет выполнять задание в одной строке.
про:
- легко писать
- нет обслуживания
минусы:
- меньше контроля над тем, что происходит
- ошибка, подверженная изменяемому объекту, если инструмент отражения не клонирует вспомогательные объекты тоже
- медленное выполнение
Использование рамки клонирования:
Используйте фреймворк, который сделает это за вас, например:
commons-lang SerializationUtils
Библиотека глубокого клонирования Java
Dozer
Kryo
про:
- то же, что отражение
- больше контроля над тем, что именно будет клонировано.
минусы:
- каждый измененный экземпляр полностью клонирован, даже в конце иерархии
- может быть очень медленным выполнение
Использовать инструментарий байт-кода для записи клона во время выполнения
javassit, BCEL или cglib может использоваться для генерации выделенного клонера так же быстро, как одна из поданных рук. Кто-то знает lib, используя один из этих инструментов для этой цели?
Что я здесь пропустил? Какой из них вы бы порекомендовали?
Спасибо.