![]() |
|
|
|||||||
| Java Basics - Anfänger-Themen Fragen ausschließlich zu Java-Grundlagen von Ein- und Umsteigern |
|
|
|
Themen-Optionen | Thema durchsuchen | Ansicht |
| #1 (permalink) | |
|
Stammbenutzer
Kilobyte
Registriert seit: 11.12.2010
Fachbeiträge: 160
Abgegebene Danke: 69
Erhielt 3 Danke für 3 Beiträge
|
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!
|
|
|
|
| #2 (permalink) | |
|
Stammbenutzer
Viertel Megabyte
Registriert seit: 14.03.2012
Fachbeiträge: 457
Abgegebene Danke: 17
Erhielt 107 Danke für 105 Beiträge
|
Das hört sich so an, als ob du gar keine echte (tiefe) Kopie erstellst, sondern beide Male auf das gleiche Objekt zeigst.
|
|
|
|
| Danke sagt: |
Herr Kaiser (16.06.2012)
|
| #3 (permalink) | |
|
Stammbenutzer
Floppy Disc
Registriert seit: 11.04.2010
Fachbeiträge: 882
Blog-Einträge: 1
Abgegebene Danke: 63
Erhielt 161 Danke für 147 Beiträge
|
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 sagt: |
Herr Kaiser (16.06.2012)
|
| #4 (permalink) | |||
|
Stammbenutzer
Kilobyte
Themenstarter
Registriert seit: 11.12.2010
Fachbeiträge: 160
Abgegebene Danke: 69
Erhielt 3 Danke für 3 Beiträge
|
Danke für eure Hinweise!
![]() @ Fant: das dachte ich zunächst auch - andererseits unterscheiden sich ja meinObjekt.titel und meinGeklontesObject.titel ![]() Sinngemäß habe ich so geklont:
@ 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!
Geändert von Herr Kaiser (16.06.2012 um 17:56 Uhr) |
||
|
|
|
| #5 (permalink) | |
|
Stammbenutzer
Halbes Gigabyte
Registriert seit: 02.09.2009
Fachbeiträge: 6.087
Abgegebene Danke: 24
Erhielt 1.225 Danke für 1.209 Beiträge
|
Durch clone() werden zwar deine Referenzen geklont, aber die zeigen unter Umständen noch auf das selbe Objekt. Du brauchst eine tiefe Kopie.
__________________
jCSV - Simple CSV library for Java - http://code.google.com/p/jcsv/ Asteroid Impact - Echtzeit-Strategie-Browsergame |
|
|
|
| Danke sagt: |
Herr Kaiser (16.06.2012)
|
| #6 (permalink) | |
|
Stammbenutzer
Kilobyte
Themenstarter
Registriert seit: 11.12.2010
Fachbeiträge: 160
Abgegebene Danke: 69
Erhielt 3 Danke für 3 Beiträge
|
Achso. Vielen Dank!
![]() Hab gerade nach Beispielcode gesucht und folgenden gefunden: Deep-Copy von Java-Objekten Der Informatik Student Was sagen die Experten dazu? |
|
|
|
| #7 (permalink) | |
|
Stammbenutzer
Kilobyte
Themenstarter
Registriert seit: 11.12.2010
Fachbeiträge: 160
Abgegebene Danke: 69
Erhielt 3 Danke für 3 Beiträge
|
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
|
|
|
|
|
| Themen-Optionen | Thema durchsuchen |
| Ansicht | |
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Aktueller Pfad des Programms (.jar) ermitteln | Aruhn | Java Basics - Anfänger-Themen | 10 | 12.05.2010 19:27 |
| Java Medien Bibiothek | Jennifer22 | AWT, Swing, JavaFX & SWT | 1 | 15.01.2010 10:13 |
| Ermitteln des aufrufenden Objekts | Gast | Allgemeine Java-Themen | 5 | 19.01.2009 18:15 |
| Speicheverbrauch einer Datenstruktur ermitteln | huckfinn | Allgemeine Java-Themen | 29 | 21.12.2006 14:54 |
| Name eines Objekts ermitteln | DonJure | Java Basics - Anfänger-Themen | 5 | 08.07.2004 11:42 |
| Lesezeichen |
|
|