Java Deep Copy с использованием сериализации в памяти

Мы все знаем, что самый простой способ глубокого клонирования(с некоторыми издержками производительности) или глубокого копирования — это сериализация. Сериализация Java включает сериализацию объекта в байты и из байтов обратно в объект.

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

Пожалуйста, помните, что глубокое клонирование — зло для шаблона singleton. Оно позволяет иметь несколько экземпляров классов singleton.

Подробнее: Клонирование объектов в Java

1. Пример глубокого копирования Java

В демонстрационной программе мы создали демонстрационный класс с именем SerializableClass. Он имеет три переменные, а именно firstName, lastName и permissions. Мы добавим метод уровня экземпляра deepCopy() к этому классу. При каждом вызове экземпляра SerializableClass он будет возвращать точный клон / глубокую копию этого экземпляра.

Для глубокого клонирования нам нужно сначала сериализовать, а затем выполнить десериализацию. Для сериализации мы использовали ByteArrayOutputStream и ObjectOutputStream. Для десериализации мы использовали ByteArrayInputStream и ObjectInputStream.

import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import java.util.List;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@AllArgsConstructor@NoArgsConstructorpublic class TestClass implements Serializable {private static final long serialVersionUID = 1L;private String firstName;private String lastName ;private List permissions;public TestClass deepCopy() throws Exception {//Serialization of objectByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream out = new ObjectOutputStream(bos);out.writeObject(this);//De-serialization of objectByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream in = new ObjectInputStream(bis);TestClass copied =(TestClass) in.readObject();return copied;}}

2. Демонстрация

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

public class DeepCopyDemo {public static void main(String[] args) throws Exception {TestClass myClass = new TestClass("Lokesh", "Gupta", List.of("ADMIN", "USER"));System.out.println(myClass);TestClass deepCopiedInstance = myClass.deepCopy();System.out.println(deepCopiedInstance);}}

Вывод программы.

TestClass(firstName=Lokesh, lastName=Gupta, permissions=[ADMIN, USER])TestClass(firstName=Lokesh, lastName=Gupta, permissions=[ADMIN, USER])

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

Исходный код на Github

Прокрутить вверх