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?Ein sehr einfacher Ansatz ist die Verwendung von Jackson JSON, um komplexe Java-Objekte in JSON zu serialisieren und zurückzulesen.
Von https://github.com/FasterXML/jackson-databind/#5-minute-tutorial-streaming-parser-generator :
JsonFactory f = mapper.getFactory(); // may alternatively construct directly too
// First: write simple JSON output
File jsonFile = new File("test.json");
JsonGenerator g = f.createGenerator(jsonFile);
// write JSON: { "message" : "Hello world!" }
g.writeStartObject();
g.writeStringField("message", "Hello world!");
g.writeEndObject();
g.close();
// Second: read file back
JsonParser p = f.createParser(jsonFile);
JsonToken t = p.nextToken(); // Should be JsonToken.START_OBJECT
t = p.nextToken(); // JsonToken.FIELD_NAME
if ((t != JsonToken.FIELD_NAME) || !"message".equals(p.getCurrentName())) {
// handle error
}
t = p.nextToken();
if (t != JsonToken.VALUE_STRING) {
// similarly
}
String msg = p.getText();
System.out.printf("My message to you is: %s!\n", msg);
p.close();
XStream( verwenden http://x-stream.github.io/ ). Sie können sogar steuern, welche Eigenschaften Sie durch Anmerkungen oder die explizite Angabe des Eigenschaftsnamens in der XStream-Klasse ignorieren können. Außerdem müssen Sie die Schnittstelle clonable nicht implementieren.
Tiefgreifendes Kopieren ist nur mit Zustimmung der einzelnen Klassen möglich. Wenn Sie die Kontrolle über die Klassenhierarchie haben, können Sie die Schnittstelle clonable implementieren und die Methode Clone implementieren. Andernfalls ist es unmöglich, eine tiefe Kopie zu erstellen, da das Objekt auch Nicht-Daten-Ressourcen (z. B. Datenbankverbindungen) gemeinsam nutzen kann. Generell gilt das tiefe Kopieren in der Java-Umgebung jedoch als schlechte Praxis und sollte durch entsprechende Entwurfspraktiken vermieden werden.
Verwendung von Jackson zur Serialisierung und Deserialisierung des Objekts. Bei dieser Implementierung ist es nicht erforderlich, dass das Objekt die Klasse Serializable implementiert.
<T> T clone(T object, Class<T> clazzType) throws IOException {
final ObjectMapper objMapper = new ObjectMapper();
String jsonStr= objMapper.writeValueAsString(object);
return objMapper.readValue(jsonStr, clazzType);
}