Mutable objects und Implementierung von ChangeEvents

SimProtect

Aktives Mitglied
Hallo zusammen,

Mich interessiert momentan ein Problem, das wir kürzlich hatten / haben. Es existiere folgendes FunctionalInterface:

Java:
@FunctionalInterface
public interface ChangeListener<T> {
   
    void changed(T oldValue, T newValue);
}

Ich habe hier der Übersicht halber mal auf die JavaDoc verzichtet. Was die jeweilige Implementierung tun soll, dürfte aber klar sein.
Ich weiß, dass es ähnliche Konstrukte auch z.B. in JavaFx gibt (dort der klassische ChangeListener, welcher letztlich das Observable, den oldValue und den newValue annimmt).

Meine Frage hierzu ist nun, ob es eine Möglichkeit gibt, sicher mit mutable Objects umzugehen und dabei zu vermeiden, dass beim Aufruf des Listeners gilt oldValue == newValue.
Wir hatten hier einige Möglichkeiten diskutiert. Eine war, die ChangeListener bereits über Änderungen zu informieren, bevor die eigentliche Operation ausgeführt worden ist. Also quasi (wieder vereinfacht dargestellt):

Java:
void set(Foo newValue) {
   notifyListener(this.value, newValue);
   this.value = newValue;
}

Das hätte allerdings den Nachteil, dass die Listener bereits über eine Änderung informiert worden sind, die noch gar nicht stattgefunden hat und die im schlimmsten Falle ggf. gar nicht stattfindet, da z.B. ein Fehler fliegt. Tauschen wir in der oben genannten Methode die Zeilen schlicht aus und speichern uns den aktuellen Wert für einen Moment zwischen, dann funktioniert das natürlich tadellos für alle None mutable objects. Für die übrigen wäre die Implementierung reichlich sinnfrei, da der alte und der neue Wert nun natürlich gleich sind. Die Referenz wurde ja ersetzt.

Gibt es eine Methode, wie man dieses Problem sauber umgehen kann, wenn man das Object nicht kennt? Im oben genannten Beispiel ist es dem Listener erstmal vollkommen egal, was T denn überhaupt ist. Ich kann also nicht sicherstellen, dass das Objekt tatsächlich nicht mutable ist oder mir eine Möglichkeit bietet, eine echte Kopie zu erzeugen. Schließlich weiß ich hierbei nicht, ob ein Clonable-Interface (sauber) implementiert ist, ob das Objekt
Serializable implementiert oder mir den DefaultKonstruktor (für newInstance() und den Zusammebau via Reflection z.B.) zur Verfügung stellt o.Ä.. Das wäre zumindest die mir bekannten Methoden, mit BoardMitteln eine echte Kopie erzeugen zu können.

Gibt es hier eine Möglichkeit? Haben wir in unserer Diskussion vielleicht auch etwas gänzlich naheliegendes schlicht übersehen?
Natürlich könnte man hier einen anderen parametrisierten Typen erzwingen, der z.B. eine Kopierbarkeit oder Ähnliches sicherstellt - aber das ist hier tatsächlich gar nicht Sinn und Zweck der Frage.

Im Team haben wir uns mittlerweile gegen diesen ChangeListener entschieden und etwas anderes angestrebt. Mich beschäftigt diese Frage allerdings immer noch aus privater Neugierde.
 

SimProtect

Aktives Mitglied
Nevermind … Der Thread kann geschlossen werden.
Offensichtlich hatten wir einen RICHTIGEN Bock gebaut.
Natürlich hat mihe7 hier völlig recht.

So hatten wir es ursprünglich auch gebaut, aber dabei offensichtlich Quark gebaut, welcher zu einem Effekt geführt hat, den wir dann falsch interpretiert haben. Blödsinnig falsch interpretiert haben. Mein Fehler hierbei (der auch zur Frage geführt hat): Ich habe diese Interpretation ohne zu hinterfragen hingenommen. Das war quatsch.

Sorry für den unnötigen und unverständlichen Thread. Ich entschuldige mich auch für Eure verschwendete Zeit. :-(
 

mihe7

Top Contributor
Kein Grund, sich dafür zu entschuldigen. Manchmal ist man einfach so im eigentlichen Problem gefangen, dass man an anderer Stelle selbst einfachste Dinge übersieht.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Handle Mutable Objects Allgemeine Java-Themen 2
Rakshan Reading through list of objects Allgemeine Java-Themen 8
? Objects aus List aussortieren Allgemeine Java-Themen 9
D Threads Expireable objects Allgemeine Java-Themen 9
B Designproblem "passing objects" Allgemeine Java-Themen 4
A Immutable Objects ? Allgemeine Java-Themen 8
C Communication zwischen zwei Projekte - static objects Allgemeine Java-Themen 4
L Unterschied zwischen List und LinkedList implementierung? Allgemeine Java-Themen 15
boschl2000 Springerproblem-Implementierung funktioniert nicht richtig Allgemeine Java-Themen 1
L rotateLeft implementierung Allgemeine Java-Themen 2
R In der Ausgabe sollte anstelle des obersten Sterns ein "+" stehen nur scheitere ich bei der Implementierung Allgemeine Java-Themen 9
D Input/Output Implementierung eines CommandHandlers/Parsers für viele Eingaben Allgemeine Java-Themen 26
Stonie Prüfen von direkter Implementierung eines Interfaces Allgemeine Java-Themen 7
W Queue Implementierung Allgemeine Java-Themen 6
C Ein Iterator ist eine Implementierung des Interface Iterable? Allgemeine Java-Themen 2
F Implementierung von Teilprogrammen [Java|Python] Allgemeine Java-Themen 7
I TimSort - Sortieralgorithmus - Erklärung und Pseudocode - Implementierung Allgemeine Java-Themen 2
L Implementierung eines AVT-Baums Allgemeine Java-Themen 2
ruutaiokwu burstsort-implementierung in java? Allgemeine Java-Themen 2
D Implementierung einer Mehrsprachigkeit, wichtig ? Allgemeine Java-Themen 5
D Implementierung einer Rechteverwaltung Allgemeine Java-Themen 2
A Implementierung eines Algorithmus (Farthest Insertion zur Lösung des TSP) in O(n²) Allgemeine Java-Themen 2
R "Countdown" Implementierung Allgemeine Java-Themen 5
K A*-Implementierung flexibler machen Allgemeine Java-Themen 4
J Java-Implementierung diverser Beziehungen zwischen Klassen bzw. Objekten Allgemeine Java-Themen 2
S BlueJ Cäsar-Implementierung Allgemeine Java-Themen 6
S Implementierung Programmneustart Allgemeine Java-Themen 10
R Implementierung eines Interface durch 2 verschiedene Klassen Allgemeine Java-Themen 6
G Implementierung einer Kommunikation Allgemeine Java-Themen 7
S Implementierung einer PluginArchitektur Allgemeine Java-Themen 5
A OOP: Überschreiben/Implementierung von Methoden Allgemeine Java-Themen 5
K Objekt einer konkreten Implementierung eines Interfaces durch übergebenen String Allgemeine Java-Themen 2
R Intervall-Implementierung mit selbstgebauter LinkedList Allgemeine Java-Themen 7
J Best Practice für implementierung von equals(...) Allgemeine Java-Themen 7
Kr0e Eigene RMI Implementierung Allgemeine Java-Themen 3
V Wie finde ich die konkrete Implementierung? Allgemeine Java-Themen 8
G Implementierung vom AKS-Test Allgemeine Java-Themen 11
R software implementierung Allgemeine Java-Themen 3
N Observer/Observable der JAVA-API od. eigene Implementierung Allgemeine Java-Themen 2
K Design / Implementierung Allgemeine Java-Themen 5
B jre browser implementierung ? Allgemeine Java-Themen 4
B Elegantere Lösung bei der Implementierung eines Interfaces Allgemeine Java-Themen 2
G Klasse Queue Implementierung in Java Allgemeine Java-Themen 4
G Eigene PrintService Implementierung. Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben