Мы все знаем, что самый простой способ глубокого клонирования(с некоторыми издержками производительности) или глубокого копирования — это сериализация. Сериализация 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])
Прежде чем рассматривать объекты глубокого копирования в памяти в своем приложении, вам, возможно, будет интересно прочитать о правилах сериализации, которые предотвратят сбои в работе вашего проекта в будущем.