Какие альтернативы конструктору копирования и сериализации для создания копий объектов в Java?

«Какие альтернативы конструктору копирования и сериализации для создания копий объектов в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Альтернативы конструктору копирования:

  1. Метод clone():

    @Override
    protected Object clone() throws CloneNotSupportedException {
        // Поверхностное копирование (shallow copy)
        return super.clone();
    }

    Недостатки: Требует реализации Cloneable, метод protected, сложность с глубоким копированием (deep copy).

  2. Статический фабричный метод (например, copyOf или newInstance):

    public static MyClass copyOf(MyClass original) {
        return new MyClass(
            original.getField1(),
            original.getField2() // глубокое копирование полей-объектов
        );
    }
  3. Использование паттерна Строитель (Builder) для копирования:

    MyClass copy = MyClass.builder()
        .field1(original.getField1())
        .field2(original.getField2())
        .build();

Альтернативы сериализации для копирования:

  1. Библиотеки сериализации в JSON/XML (Gson, Jackson, JAXB):

    // Пример с Jackson
    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(original);
    MyClass copy = mapper.readValue(json, MyClass.class);

    Ограничение: Не сохраняет transient поля и может быть медленнее нативной сериализации.

  2. Библиотеки для отражения (Reflection): Например, Apache Commons Lang SerializationUtils.clone().

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