373 Stimmen

Wie erstellt man eine Tiefenkopie eines Objekts?

Es ist etwas schwierig, eine tiefe Objektkopierfunktion zu implementieren. Wie stellen Sie sicher, dass das Originalobjekt und das geklonte Objekt keine gemeinsame Referenz haben?

25voto

CorayThan Punkte 15917

Sie können eine Bibliothek benutzen die eine einfache API hat und relativ schnelles Klonen mit Reflection durchführt (sollte schneller sein als Serialisierungsmethoden).

Cloner cloner = new Cloner();

MyClass clone = cloner.deepClone(o);
// clone is a deep-clone of o

24voto

Ihor Rybak Punkte 2891

Para Spring Framework Benutzer. Klasse verwenden org.springframework.util.SerializationUtils :

@SuppressWarnings("unchecked")
public static <T extends Serializable> T clone(T object) {
     return (T) SerializationUtils.deserialize(SerializationUtils.serialize(object));
}

20voto

TheByeByeMan Punkte 1417

Apache Commons bietet eine schnelle Möglichkeit, ein Objekt tief zu klonen.

My_Object object2= org.apache.commons.lang.SerializationUtils.clone(object1);

13voto

tiboo Punkte 6887

Für komplizierte Objekte und wenn die Leistung nicht wichtig ist, verwende ich eine json-Bibliothek, wie gson um das Objekt in Json-Text zu serialisieren und dann den Text zu deserialisieren, um ein neues Objekt zu erhalten.

gson, das auf Reflexion basiert, funktioniert in den meisten Fällen, außer wenn transient Felder werden nicht kopiert und Objekte mit zirkulärem Verweis mit Ursache StackOverflowError .

public static <T> T copy(T anObject, Class<T> classInfo) {
    Gson gson = new GsonBuilder().create();
    String text = gson.toJson(anObject);
    T newObject = gson.fromJson(text, classInfo);
    return newObject;
}
public static void main(String[] args) {
    String originalObject = "hello";
    String copiedObject = copy(originalObject, String.class);
}

10voto

sankara Punkte 361

XStream ist in solchen Fällen sehr nützlich. Hier ist ein einfacher Code für das Klonen

private static final XStream XSTREAM = new XStream();
...

Object newObject = XSTREAM.fromXML(XSTREAM.toXML(obj));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X