Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
7 профессий по цене одной
07:05:47:06
дн. ч. мин. сек.
10 Июл 2023
2 мин
1139

Создаем глубокую копию объекта в Java

Проблема Глубокое копирование объектов в Java может быть сложной задачей. Рассмотрим пример: имеется объект Person со свойствами Name и Address. Если попытаться

Проблема

Глубокое копирование объектов в Java может быть сложной задачей. Рассмотрим пример: имеется объект Person со свойствами Name и Address. Если попытаться создать его поверхностную копию, то оба объекта будут ссылаться на один и тот же адрес в памяти, следовательно, изменение адреса в одном объекте приведет к его изменению и в другом.

class Person {
    String name;
    Address address;
}

class Address {
    String street;
    String city;
}

Person john = new Person();
john.name = "John";
john.address = new Address();
john.address.street = "Main St";
john.address.city = "New York";

Person copy = john; // поверхностное копирование
copy.address.street = "Wall St"; // изменит адрес у обоих объектов

Решение

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

Вариантов реализации глубокого копирования несколько. Один из них — использование метода clone():

class Address implements Cloneable {
    String street;
    String city;

    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

class Person implements Cloneable {
    String name;
    Address address;

    public Object clone() throws CloneNotSupportedException {
        Person copy = (Person) super.clone();
        if (this.address != null) {
            copy.address = (Address) this.address.clone();
        }
        return copy;
    }
}

Такой подход создает новый объект с теми же значениями полей, что и у исходного, но исключает возможность влияния на исходный объект изменениями в его копии.

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

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

public static Object deepCopy(Object object) {
    try {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ObjectOutputStream outputStrm = new ObjectOutputStream(outputStream);
        outputStrm.writeObject(object);
        ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
        ObjectInputStream objInputStream = new ObjectInputStream(inputStream);
        return objInputStream.readObject();
    }
    catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

Таким образом, глубокое копирование объектов в Java можно осуществить различными способами, каждый из которых имеет свои преимущества и недостатки.

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий