Discussion:
Alle Referenzen, die auf ein Objekt zeigen, auf ein neue Instanz umlenken
(zu alt für eine Antwort)
Sven Hütten
2003-09-18 12:21:22 UTC
Permalink
Hallo Leute, ich habe ein Objekt, welches von mehreren Stellen aus
referenziert wird.

Nun möchte ich eine Kopie des Objektes erzeugen (mit clone()) und alle
Referenzen sollen auf die Kopie umgelenkt werden.

Warum??

Ich habe ein Bean-Objekt mit ca. 70 Datenmember. Nun folgt eine lange Reihe
von Verarbeitungsschritten, wo die Member verändert werden können (z.B.
mehrere Bildschirmmasken). Im Objekt werden nun alle Datenmember
nacheinander gesetzt (nach jeder Bildschirmmaske) und zum Schluss wird
gespeichert bzw. abgebrochen, wenn der Benutzer es möchte.

Bricht der Benutzer ab, so sind trotzdem alle Member noch gesetzt. Deshalb
wollte ich ein geklontes Objekt in die Verarbeitung (Masken) geben, d.h. im
Abbruchfall habe ich noch mein originales Objekt. Im Erfolgsfall (also
Speicherung) sollen nun alle Referenzen, die auf das originale Objekt
zeigen, nun auf das geclonte Objekt zeigen. Oder gibt es noch eine
Möglichkeit, das alle Member im originalen Objekt die Werte der Kopie
annehmen? Sollte wohl nicht so sein, denn ich habe natürlich alle Member
private deklariert. Oder gibt es doch noch eine Möglichkeit ???

(Ich wollte schon über das Reflection API alle set-methoden des originalen
Objekt mit den get-Methoden der Kopie invoken. Ich halte das aber für sehr
unsauber...)


Hat jemand eine Idee wie ich mein problem lösen könnte?? Am liebsten wäre
mir eine Umlenkung aller Referenzen...


Viele Grüße an alle Java-Freaks...

Sveni
Stefan Matthias Aust
2003-09-18 12:39:00 UTC
Permalink
Du suchst "allReferences" und "become:", aber dafür müsstest du
Smalltalk und nicht Java machen :) In Smalltalk würde auch clone besser
funktionieren, welches man jetzt eigentlich kaum gebrauchen kann, weil
man immer den Typ casten muss und die Methode fast immer überschreiben
musst, falls deine Objekte selbst wieder Objekte klonen müssen.

In Java hast du kaum eine Chance. Führe am besten die Referenz explizit
ein. Dadurch hast du dann nur eine wohlbekannte stelle, die du ändern
musst.

Allerdings denke ich, dass der ganze Ansatz nicht für dein Problem
taugt. Du solltest explizit kopieren und aus dem UI nur dann ins Modell
zurückschreiben, wenn die Daten dort okay sind.


bye
--
Stefan Matthias Aust // "Ist es normal, nur weil alle es tun?" -F4
Stefan Matthias Aust
2003-09-18 13:48:11 UTC
Permalink
habe durch Zufall ne Möglichkeit gefunden, die privaten Datenmember zu
setzen: [...]
Das du "zufällig" die Dokumentation gelesen oder wie? ;) Reflections
erlauben auch das ändern von privaten Daten. Ein Security-Manager kann
das verhindern und würde eine Exception bei setAccessible() werden.

bye
--
Stefan Matthias Aust // "Ist es normal, nur weil alle es tun?" -F4
Sven Köhler
2003-09-18 14:09:20 UTC
Permalink
habe durch Zufall ne Möglichkeit gefunden, die privaten Datenmember zu
Das hat nicht mehr mit OO design und/oder Programmieren zu tun. Dass ist
dann eher "mit dem Kopf durch die Wand".

Sowas will ich hier nich sehen. Hinterher ist das noch ansteckend.
Sven Hütten
2003-09-18 14:50:22 UTC
Permalink
Ihr habt ja alle Recht. Es gibt ja nicht umsonst die Kapselung. Aber
interessant zu sehen, das es doch wieder ne Möglichkeit gibt, Datenmember zu
manipulieren.

Ich werde wohl doch explizit kopieren und dann zurückschreiben wenn alles ok
ist.

Vielen Dank für Eure schnellen Antworten...

PS: Eure Newsgroup ist echt spitze und supergepflegt...

PS2: Schönen Gruß an Stefan Matthias Aust, den Namen lese ich öfters, und er
gibt richtig gute Tipps.....

Bleibt mir der Name wegen Spiegel-TV im Gedächtsnis???? :-))))))
Post by Sven Köhler
habe durch Zufall ne Möglichkeit gefunden, die privaten Datenmember zu
Das hat nicht mehr mit OO design und/oder Programmieren zu tun. Dass ist
dann eher "mit dem Kopf durch die Wand".
Sowas will ich hier nich sehen. Hinterher ist das noch ansteckend.
Steve Ulrich
2003-09-18 21:09:36 UTC
Permalink
Post by Sven Hütten
Hallo Leute, ich habe ein Objekt, welches von mehreren Stellen aus
referenziert wird.
Nun möchte ich eine Kopie des Objektes erzeugen (mit clone()) und alle
Referenzen sollen auf die Kopie umgelenkt werden.
[snip]
Post by Sven Hütten
Hat jemand eine Idee wie ich mein problem lösen könnte?? Am liebsten wäre
mir eine Umlenkung aller Referenzen...
Hi!

Wie wäre es mit je einer Mantelklasse und einer Datenklasse. Das
Mantelobjekt delegiert alle Methodenaufrufe an das Datenobjekt. Nun
kannst du einfach das Datenobjekt innerhalb des Mantelobjektes tauschen,
ohne das du ne Referenz umbiegen musst. Schließlich kennen alle nur das
Mantelobjekt.

Gruß

Steve

Loading...