Veränderung eines Objekts ermitteln

Herr Kaiser

Bekanntes Mitglied
Hallo Forum,

ich habe ein Objekt mit inzwischen recht vielen Variablen, deren Werte über eine Benutzeroberfläche verändert werden können. Sobald eine Eigenschaft verändert wurde, soll ein Speicher-Button aktiviert werden. Nach jedem Speichern des Objekts wird er bis zur nächsten Änderung wieder deaktiviert, wie man das so üblicherweise von Anwendungen kennt. Um das zu realisieren, lasse ich bei jedem Speichervorgang ein Klon des Objekts erstellen und bei jeder Veränderung der Eigenschaften des aktuellen Objekts überprüfen, ob sich diese nun von denen des gespeicherten Zustands im Klon unterscheiden. Ich habe beispielsweise die String-Variable "titel". Wenn ich diese über ein Textfeld nach einer Speicherung ändere, unterscheiden sich meinObjekt.titel und meinGeklontesObjekt.titel und der Button wird entsprechend aktiviert. Ich habe aber auch eine Arraylist "datenformat", bestehend aus Strings (die die Werte Text, Zahl und Datum annehmen können). Wenn ich nun meinObjekt.datenformat.set(3,"Text") setze, wird der Wert gleichzeitig automatisch auch in meinGeklontesObjekt übernommen, so dass sich das aktuelle und das geklonte Objekt bezüglich der ArrayList nie unterscheiden und daher mein Ansatz nicht wie gewünscht funktioniert. Jetzt frage ich mich, warum das so ist. Zunächst dachte ich "aha, ArrayList=Referenzdatentyp!", aber für den einfachen String "titel" gilt das ja auch, warum verhält sich das Klonobjekt da anders? Mache ich etwas falsch oder eignet sich der Ansatz prinzipiell nicht für meine Fragestellung?
Hoffe, meine Anfängerdarstellung ist verständlich 😳 ?
Dank im Voraus! 🙂
 
Das hört sich so an, als ob du gar keine echte (tiefe) Kopie erstellst, sondern beide Male auf das gleiche Objekt zeigst.
 
Selbst mit einer ordentlichen Kopie könnte die Variante sehr teuer werden.
Angenommen das Objekt ist eine Textdatei mit 50k Zeichen, die für jede Änderung zu prüfen ob etwas geändert wurde wird teuer 😉

Einfacher wäre es vermutlich den Button oder eine passende Zwischenschnittstelle bei dem Objekt als Observer zu registrieren und das Objekt bei jeder Änderung die Observer informieren lassen.
Sobald man speichert deaktiviert man einfach den Button und sobald ein Event von dem Objekt reinkommt aktiviert man ihn wieder.

Gruß
 
Danke für eure Hinweise! 🙂

@ Fant: das dachte ich zunächst auch - andererseits unterscheiden sich ja meinObjekt.titel und meinGeklontesObject.titel ???:L

Sinngemäß habe ich so geklont:

[Java]
public class MeinObject implements Serializable, Cloneable {
...
@Override
public MeinObject clone() {
try {
return (MeinObject) super.clone();
} catch (CloneNotSupportedException e) {
// Kann eigentlich nicht passieren, da Cloneable
throw new InternalError();
}
}
[/code]

[Java]
meingGeklontesObject=meinObject.clone();
[/code]

@ Firephoenix: Mein Ansatz kommt mir auch unökonomisch vor. Mir fiel nichts anderes ein und vom Implementierungsaufwand hielt es sich noch in Grenzen - wenn es nur funktionieren würde. Mit Observern kenne ich mich noch nicht aus. Werde mich da mal einlesen ...

Vielen Dank! 🙂
 
Zuletzt bearbeitet:
Durch clone() werden zwar deine Referenzen geklont, aber die zeigen unter Umständen noch auf das selbe Objekt. Du brauchst eine tiefe Kopie.
 
Hab den obigen Code ausprobiert. Funktioniert so einwandfrei. Für's erste reicht das aus. Werde die Performance mal beobachten und ggf. mich an die Observer heranwagen.

Vielen Dank nochmal an alle 🙂
 

Zurück
Oben