Java, ist das eine Deep Copy?

7

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.

    
Snowdrama 25.03.2013, 08:56
quelle

5 Antworten

4

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.

    
Kevin Bowersox 25.03.2013, 09:10
quelle
11
  

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.

    
Subir Kumar Sao 25.03.2013 09:02
quelle
3

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).

    
Dennis Laumen 25.03.2013 09:05
quelle
2

In Java gibt es zwei Datentypen:

  • Primitive (float, int, double, boolean ...), die nicht das Konzept des tiefen / flachen Kopierens haben, weil sie mit Zuweisungen arbeiten.
  • Objekte, bei denen eine flache Kopie das Übergeben der Referenz bedeutet. während eine tiefe Kopie bedeutet, ein neues Objekt mit den gleichen Werten wie die Quelle zu haben.

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.

%Vor%     
Mr.Me 25.03.2013 09:05
quelle
2

Ссылка

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.

%Vor%     
Sami N 25.03.2013 09:06
quelle

Tags und Links