Ich kann nicht scheinen, eine klare genaue Antwort zu erhalten, indem ich irgendwelche der ähnlichen Fragen lese, ich versuche, ein Objekt in Java zu klonen, das einen Kopiekonstruktor verwendet, ist dieses eine tiefe Kopie:
%Vor%Wenn ich meine Kachelkarte erstelle, könnte ich so etwas tun
%Vor%Wenn ich beide Kacheln an ihren jeweiligen Positionen rendern würde, würde das funktionieren? oder war die Zuweisung tileList.get (1) .setNewLocation (0,64); wie eine Referenz wirken und alle haben den gleichen Ort wie die letzte Zuweisung.
Lassen Sie uns zuerst die Unterschiede zwischen einer tiefen und einer flachen Kopie betrachten.
Eine flache Kopie zeigt auf die gleichen Referenzen wie die Quelle. Wenn Sie also eine Kopie der Instanz A
named B
erstellen, werden alle Änderungen an Feldern, die Objekte in B
enthalten, diese Felder in A
ändern, da sie auf dieselbe Referenz verweisen.
Eine tiefe Kopie hat unabhängige Felder / Referenzen, sie zeigt nicht auf die Referenzen der Quelle. Eine Änderung an einem Feld / einer Eigenschaft in der Kopie wirkt sich nicht auf die Felder / Eigenschaften der Quelle aus.
In Ihrem Fall glaube ich, dass Sie eine flache Kopie erstellt haben, seit Sie den Bezug des Sprite-Feldes von der Quelle zum Sprite-Feld der Kopie zugewiesen haben.
Um dies zu verdeutlichen, habe ich die Tile
-Klassen-Quelle modifiziert, um Image
freizulegen und eine Image
-Klasse zu verspotten.
Änderungen am Konzeptnachweis
%Vor%Machbarkeitsnachweis
%Vor%Beachten Sie, dass sich das Ändern der Sprite-Eigenschaft der kopierten Instanz auf die Sprite-Eigenschaft der ursprünglichen Instanz auswirkt.
ist das eine tiefe Kopie?
Nein, das liegt nicht daran, dass this.sprite = copyTile.sprite;
beide Objekte von Tile
auf dasselbe Objekt von Image
verweisen.
Wenn ich beide Kacheln an ihren jeweiligen Positionen rendern würde, würde das funktionieren? oder war die Zuweisung tileList.get (1) .setNewLocation (0,64); wie eine Referenz wirken und alle haben den gleichen Ort wie die letzte Zuweisung.
Nein, die Werte von x und y sind in den beiden Objekten von Tiles
unabhängig und Code sollte funktionieren und beide Objekte haben unterschiedliche x- und y-Werte.
Nein, dies ist keine tiefe Kopie, da das gleiche Image-Objekt von allen Tile-Objekten gemeinsam genutzt wird.
Wenn Sie sich Ihr Beispiel anschauen, scheint es, dass diese Kopie für Ihre Bedürfnisse ausreichen würde, da Sie dasselbe Image-Objekt an verschiedenen Orten wiederverwenden können (was vermutlich effizienter ist).
In Java gibt es zwei Datentypen:
Wenn Sie den obigen Code angeben, wird das tiefe Kopieren beim Übergeben des Image
-Objekts nicht erfüllt.
Wenn Sie mit diesem Objekt rendern, kann dieses Objekt nur eine Position haben. was dazu führt, dass dein Code beide Kacheln am selben Ort darstellt.
Um das zu beheben, sollten Sie Ihr Image
Objekt klonen.
Wenn eine Methode einen Verweis auf ein internes veränderbares Objekt zurückgibt, kann der Clientcode den internen Status der Instanz ändern. Wenn Sie nicht den Status teilen möchten, kopieren Sie veränderbare Objekte und geben Sie die Kopie zurück.
Sie müssten also tatsächlich eine neue Instanz aus Image
erstellen.