Es ist etwas schwierig, eine tiefe Objektkopierfunktion zu implementieren. Wie stellen Sie sicher, dass das Originalobjekt und das geklonte Objekt keine gemeinsame Referenz haben?
Antworten
Zu viele Anzeigen?Ich habe Planierraupe für das Klonen von Java-Objekten und es ist großartig darin, Kryo Bibliothek ist eine weitere gute Alternative.
1)
public static Object deepClone(Object object) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(object);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}
2)
// (1) create a MyPerson object named Al
MyAddress address = new MyAddress("Vishrantwadi ", "Pune", "India");
MyPerson al = new MyPerson("Al", "Arun", address);
// (2) make a deep clone of Al
MyPerson neighbor = (MyPerson)deepClone(al);
Hier müssen die Klassen MyPerson und MyAddress die Schnittstelle serilazable implementieren
Hier ist eine generische Deep-Cloning-Methode, die Objektserialisierung und -deserialisierung mit Byte-Array-Streams verwendet (um das Schreiben in eine Datei zu vermeiden).
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
@SuppressWarnings("unchecked")
public static <T extends Serializable> T deepClone(T t) {
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);) {
oos.writeObject(t);
byte[] bytes = baos.toByteArray();
try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes))) {
return (T) ois.readObject();
}
} catch (IOException | ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
Eine sehr schnelle und einfache Ein-Zeilen-Lösung könnte die Verwendung von Jackson sein.
Schauen Sie sich das Beispiel-Snippet an:
ObjectMapper objectMapper = new ObjectMapper();
MyClass deepCopyObject = objectMapper
.readValue(objectMapper.writeValueAsString(originalObject), MyClass.class);
Im obigen Beispiel : " MyClass " bezieht sich auf die Klasse des Objekts, das kopiert werden soll.
- Erläuterung : Wir versuchen einfach, das ursprüngliche Objekt in eine Zeichenkette zu serialisieren und dann die Zeichenkette wieder in ein Objekt zu de-serialisieren und so eine Deep Copy zu erhalten.
- Erfahren Sie hier mehr über ObjectMapper: https://fasterxml.github.io/jackson-databind/javadoc/2.7/com/fasterxml/jackson/databind/ObjectMapper.html