java-forum.org - Java programmieren aus Leidenschaft
Java 6 Einstieg und professioneller Einsatz
Alter Preis: 34,90 EUR
Jetzt: 0,00 EUR

zzgl. Versandkosten

Zurück   java-forum.org - Java programmieren aus Leidenschaft > Java - Programmierung > Java Basics - Anfänger-Themen

Java Basics - Anfänger-Themen Fragen ausschließlich zu Java-Grundlagen von Ein- und Umsteigern

Antwort     Ist dieses Thema erledigt?
Themen-Optionen Thema durchsuchen Ansicht
Alt 16.06.2012, 16:01   #1 (permalink)
Stammbenutzer
Kilobyte
 
Registriert seit: 11.12.2010
Fachbeiträge: 160
Abgegebene Danke: 69
Erhielt 3 Danke für 3 Beiträge
Standard Veränderung eines Objekts ermitteln

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!
Herr Kaiser ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 16.06.2012, 16:26   #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.
Fant ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Danke sagt:
Herr Kaiser (16.06.2012)
Alt 16.06.2012, 17:04   #3 (permalink)
Stammbenutzer
Floppy Disc
 
Benutzerbild von Firephoenix
 
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ß
Firephoenix ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Danke sagt:
Herr Kaiser (16.06.2012)
Alt 16.06.2012, 17:44   #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:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
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();
   }
}

Java Code: Quelltext in neuem Fenster öffnen
1
meingGeklontesObject=meinObject.clone();

@ 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)
Herr Kaiser ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 16.06.2012, 17:59   #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
EikeB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Danke sagt:
Herr Kaiser (16.06.2012)
Alt 16.06.2012, 18:11   #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?
Herr Kaiser ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 16.06.2012, 19:52   #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
Herr Kaiser ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Antwort     Ist dieses Thema erledigt?

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
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

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:02 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de