Wann verwendet man PropertyChangedEvents, wann eigene?

Status
Nicht offen für weitere Antworten.

Marco13

Top Contributor
Hi

Gibt es irgendwelche "best practices", wie man das Event-Handling von "vielen" Modellen und Eigenschaften am günstigsten implementiert?

PropertyChangeEvents sind mir irgendwie suspekt: Einerseits sind sie sehr praktisch (und so allgemein, dass es schon nichtmehr allgemeiner geht), aber andererseits sind sie ja eigentlich nur für Java Beans gedacht, und durch die "Object" als values so wenig typsicher und durch die String-identifier so Fehleranfällig (etwa, wenn Members umbenannt werden) dass ich nicht sicher bin, ob man sie in eigenen Modellen überhaupt verwenden sollte... ???:L
Anders formuliert: Man könnte ja theoretisch(!) ALLE Events als "PropertyChangeEvent" implementieren (Selbst bei MouseEvents wird ja nur die "Property" der Mausposition geändert - nur zur Verdeutlichung... :roll: ), und es muss ja einen Grund geben, warum das nicht gemacht wird...

Wenn man aber viele Modellklassen und viele Eigenschaften hat, erscheint mir das Erstellen von dedizierten Listener-Interfaces mit 5, 10 oder mehr Methoden und das Erstellen, Feuern und Behandeln der dazugehörigen Events so repititiv und redundant (und beim Implementieren so verdammt langweilig :roll: ), dass ich mir kaum vorstellen kann, dass es da nicht eine bessere Lösung gibt... :(

Sicher kann man sich da einige Ansätze überlegen, aber irgendwie hat man wohl immer diesen "Tradeoff" zwischen der Typsicherheit und dedizierten, eindeutigen Methoden bei einzelnen Listenern, und einem einfachen, allgemeinen, aber auch etwas "schwammigen" Konzept mit allgemeinen Events und irgendwelchen String-Identifiern für die geänderten Eigenschaften.

Mich würde interessieren, wie ihr die verschiedenen Ansätze einschätzt, ob ihr vielleicht einen "goldenen Mittelweg" kennt, oder wo ihr Vor- oder Nachteile seht, die ich noch nicht bedacht habe.

bye
 

Niki

Top Contributor
Naja, ich hab einmal versucht ein Projekt wirklich schön strukturiert zu verwirklichen und hab zwischen den Komponenten (Controller und View) nur mittels PropertyChangeEvents kommuniziert. Ich wollte das damals einfach mal ausprobieren, jedoch finde ich es bei einer so engen Verbindung unnötig. Es macht den Code unleserlich und es ist schwer nachzuvollziehen was passiert.
Wenn du eine Bean implementierst, die Eigenschaften hat welche sich ändern können kannst du das schon mit einem PropertyChangeListener realisieren. Ansonsten bietet sich ja auch manchmal das Observer Pattern an.
Bei engen Verbindungen zwischen Klassen würde ich direkt auf Method-Calls arbeiten (wie eben bei View und Controller, nur das Model sollte natürlich komplett losgelöst implementiert sein)
 

inflamer

Bekanntes Mitglied
Moin!

Also, die Eigenschaften/String-Identifier oder wie auch immer man sie nennen mag, kann man ja in Konstanten "festhalten". Das Problem fällt also schon mal weg.

Des weiteren wird von dem PropertyChangeListener trotz seiner Residenz im java.beans-Package auch in der Swing-API regen Gebrauch gemacht. (s. http://java.sun.com/javase/6/docs/api/java/beans/PropertyChangeListener.html - All Known Implementing Classes)

Auch ein Vorteil: Leitet man eine Klasse ab, die bereits ein Listener ist, kann man sich die add/removeListener()-methoden sowie eine EventListenerList u.U. sparen.

Nachteil ist IMHO einzig die Typunsicherheit bzw. die Notwendigkeit des Castens.

Sinnvoll einen weiteren (eigenen?) Listener zu verwenden erscheint mir aber dann, wenn bestimmte Events aus konzeptioneller Sicht nicht jeden Listener etwas angehen, sprich nicht alle aufkommenden Events an sämtliche Listener verschickt werden sollen (Stichwörter: Kapselung, Performance).

(Kein Anspruch auf Vollständigkeit und Objektivität. ;-) )
 

Marco13

Top Contributor
OK, die Alternativen wie Observer sind mir prinzipiell bekannt, aber eigentlich ist das Observer-Pattern auch nur ein Event-Listener-Pattern, wo der geworfene Event eben "void" ist :wink:

Hmja, dass man die String-IDs nicht 100x per Hand in den Code hacken würde, ist klar, so gesehen ist das vielleicht nichtmal das größte Problem (anstelle eines Strings denke ich jetzt an einen enum, was von der Verwendung her ziemlich ähnlich ist, aber noch einen Hauch mehr Typsicherheit bietet).

Unschön finde ich bei einer "allgemeinen" Listener-Klasse (wie PropertyChangeListener), dass der Code ziemlich verwirrend und mehrdeutig werden kann, wenn man einen Listener zu ZWEI (oder mehr) anderen Klassen addet, und dort dann mit "if (event.getSource() == ...)" rumhantieren muss... :? Aber vermutlich ist das der Preis, den man zahlt, wenn man nicht 100x Code schreiben will, der zwar jedesmal "strukturell gleich" ist, aber sich immer in einem Klassen/Methodennamen unterscheidet :?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Exceptions - wann / wie verwenden? Allgemeine Java-Themen 4
LimDul Spezifkation, wann es deprecation Warnings gibt Allgemeine Java-Themen 1
N Streams wann .filtern? Allgemeine Java-Themen 2
perlenfischer1984 Wann ist ein Parameter Check sinnvoll Allgemeine Java-Themen 7
T GUICE- Dependency Injection- WANN nutze ich Providers? Allgemeine Java-Themen 2
B Erkennen, wann Prozess beendet ist, dann Thread beenden. Allgemeine Java-Themen 6
D Wann sollte ich statische Methoden und Variablen benutzen? Allgemeine Java-Themen 44
Rudolf Wann System.exit und wann dispose? Allgemeine Java-Themen 9
L Checkstyle: Wann ist eine Methode für Vererbung entworfen? Allgemeine Java-Themen 13
X Wann ist Runtime.getRuntime().exec mit Copy fertig? Allgemeine Java-Themen 10
M Wann ist MVC sinnvoll? Allgemeine Java-Themen 14
M Wann Membermethoden, wann statische Utility-Methoden? Allgemeine Java-Themen 24
Ark Wann 64 Bit-Befehle im Einsatz? Allgemeine Java-Themen 6
G Wann normale Exception und wann Runtimeexception Allgemeine Java-Themen 12
Y Wann folgende Technologien benutzen Allgemeine Java-Themen 5
G Parameter oder Attribut (wann nehme ich was?) Allgemeine Java-Themen 12
F Wann und wie Exceptions einsetzen? Allgemeine Java-Themen 13
G Wann statische Methoden, statische Attributen? Allgemeine Java-Themen 7
G Ab wann Datenbank verwenden Allgemeine Java-Themen 15
B Wann Interface und wann Adapter Allgemeine Java-Themen 4
B ObjectInputStream - Wann ist Ende erreicht? Allgemeine Java-Themen 10
D Wann ist das ergebnis einer Rechnung eine Double? Allgemeine Java-Themen 7
M Maximal verfügbarer Hauptspeicher? Ab wann wird ausgelagert? Allgemeine Java-Themen 13
P Wann kommt denn nun 1.5 überhaupt? Allgemeine Java-Themen 6
S Verwendet Programmiersprache aus Quellcode - Datei ermitteln Allgemeine Java-Themen 6
G Ant Probleme bei einer Installation die Apache ant+ivy verwendet Allgemeine Java-Themen 14
T @NotBlank verwendet nicht message aus .property-File Allgemeine Java-Themen 4
G Gleiche Packages in verschiedenen JAR Dateien - Welches Package wird verwendet? Allgemeine Java-Themen 5
C log4j.properties wird nicht verwendet?? Allgemeine Java-Themen 3
S Vererbung: Welche Methode wird verwendet? Allgemeine Java-Themen 9
C Kopieren von Dateien die von einem anderen Programm verwendet werden? Allgemeine Java-Themen 7
J Eigener ClassLoader wird nicht immer verwendet Allgemeine Java-Themen 3
W VersionsVerwaltung welches Tool Verwendet ihr Allgemeine Java-Themen 12
Redfrettchen addAll verwendet kein Iterator? Allgemeine Java-Themen 8
H Welche Scriptsprache verwendet ihr in Java Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben