Seiteneffekte vermeiden..?
-
Hallo,
ich fürchte, dass der folgende Ansatz unerwünschte Seiteneffekte mit sich bringen würde:
Ich habe eine Klasse VereinsVektor. Überraschenderweise ist dies ein Vektor bestehend aus Vereinen... Jetzt möchte ich gerne die Möglichkeit haben, dem Konstruktor einen existierenden VereinsVektor und z.B. eine Zahl k zu übergeben. Der neue VereinsVektor soll dann die übergebenden Vereine beinhalten, allerdings sollen sie im VereinsVektor um die Zahl k "verschoben" sein. Z.B. so:
public VereinsVektor (VereinsVektor ursprungsVektor, int k) { vektor = ursprungsVektor; vektor.rotiere(k); }
Soweit so gut. Aber das würde den unangenehmen Seiteneffekt auslösen, dass die Reihenfolge im ursprünglichen VereinsVektor ebenfalls verschoben wäre, oder?
-
Korrekt. Du musst den Vektor kopieren. Vielleicht hat er einen Kopierkonstruktor, sonst musst du das von Hand machen.
Aber vorsicht! Selbst die kopierten Vektoren referenzieren immer noch die selben Vereine!
-
Heisst das, ich sollte clone() benutzen bzw. implementieren?
-
Also Vector hat einen Konstruktor, der aus einem Collection-Objekt (ein Vector ist auch ein Collection-Objekt) einen Vector konstruiert.
Jetzt kommt es darauf an:willst du den Vector samt den Elementen kopieren und die Referenzen (die Elemente) immer noch auf die selben Vereine zeigen lassen
ODER
willst du den Vector samt Inhalt UND samt den referenzierten Vereinen kopieren? Aber dann würde doch das rotieren eh keinen Sinn mehr machen, wenn die Referenzen dann auf völlig andere (kopierte) Vereine zeigen, oder? Ich weiss ja nicht, wofür du das brauchst.
-
Die Vereine können (sollen) ruhig weiter Referenzen sein.
-
Klar, das sind sie sowieso. Die Frage ist, ob du willst, dass die beiden Vectoren die selben (nicht die gleichen, sondern die identischen) Vereine referenzieren, dann hast du kein großes Problem, dann musst du halt den Vector mit dem Kopierkonstruktor kopieren.
-
In beiden VereinsVektoren sollen identische Vereine sein. Jetzt muss ich mich aber outen: Was genau ist ein Kopierkonstruktor..?
-
Ein Konstruktor, der ein neues Objekt erzeugt, anhand eines übergebenen Objekts vom selben Typ.
Wie du sicher weisst, kopierst du mit '=' nur die Referenz auf ein Objekt. Deshalb braucht man einen speziellen Konstruktor, der ein _neues_ Objekt erstellt, das eine Kopie von einem bereits existierendem Objekt ist.
Folgendes sollte eigentlich funktionieren:
Vector myCopy = new Vector(myOldVector);
-
Ahhh..! Danke. Ich wusste nicht, dass es Kopierkonstruktor heisst bzw. hatte es vergessen.