Copy-Constructor

banshee

Bekanntes Mitglied
Hi,

in der Java-Insel gibt es ja folgendes Beispiel dazu:

Java:
Player patric = new Player(); 
patric.name = "Patric Circle"; 
patric.item = "knot"; 
 
Player tryk = new Player( patric ); 
System.out.println( tryk.name );  // Patric Circle 
System.out.println( tryk.item );  // knot

Was passiert nun aber, wenn man die Attribute von patric verändert? Wenn ich mich recht entsinne, werden primitive Datentypen (und String?!) immer kopiert, aber wenn Player Objekte als Attribute hätte und man diese in patric verändert, dann ändern sie sich doch automatisch auch in tryk, weil der Verweis nur per Referenz ist oder sehe ich das falsch?
 
Was passiert nun aber, wenn man die Attribute von patric verändert? Wenn ich mich recht entsinne, werden primitive Datentypen (und String?!) immer kopiert,

Strings sind immutable, man kann sie nicht verändern, also ist beim Kopieren auch sichergestellt, dass da keine anderes Objekt "dran rumwursteln kann".

aber wenn Player Objekte als Attribute hätte und man diese in patric verändert, dann ändern sie sich doch automatisch auch in tryk, weil der Verweis nur per Referenz ist oder sehe ich das falsch?

Das hängt von der Implementation des Konstruktors ab. Wenn er eine Deep-copy implementierung ist, dann sind patric und tryk vollständig von einander gestrennt. Ansonsten, hast du recht. Ich kann allerdings dazu nichts sagen, da ich das Beispiel nicht offen habe.
 
Das Beispiel, um das es mir in erster Linie ging, war folgendes:

Java:
/**
 * A class representing all the machines that are currently
 * unused. 
 */
public class MachineRoom{
  private Vector<MachineInterface> machines;

  public MachineRoom(MachineRoom other){
	  machines = other.machines;
  }
  public MachineRoom(){
    machines = new Vector<MachineInterface>();
  }

   ...
}

Wenn man jetzt am Vektor in other rumspielt, ändert er sich auch in this. Scheint mir irgendwie nicht wirklich Sinn der Sache zu sein. Man müsste hier also einen neuen Vektor in this anlegen und other.machines elementweise kopieren, wenn man das Verhalten so nicht will?!
 
Man muss immer zwischen flachen und tiefen Kopien unterscheiden. Im ersten Beispiel wird, da es sich um Strings handelt, eine tiefe Kopie erstellt. Wenn sich die String-Attribute in der einen Klasse durch eine Zuweisung ändern, beeinflusst das nicht die Strings in der anderen Klasse und umgekehrt. Im zweiten Beispiel wird allerdings eine flache Kopie erstellt. Änderungen der Vector-Elemente bekommen beide Klassen mit, da beide eine Referenz auf denselben Vector haben.
 
Zuletzt bearbeitet von einem Moderator:
Jetzt könnte man noch hinzufügen, dass es sich immer dann um eine tiefe Kopie handelt, wenn elementeweise kopiert wird (oder wenn primitive Datentypen kopiert werden), und andernfalls um eine flache Kopie. Allerdings gibt es dabei auch Ausnahmen, wie bei String z.B., wobei nicht die einzelnen Zeichen kopiert werden, es sich aber dennoch um eine tiefe Kopie handelt, einfach weil String immutable ist.
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben