Beans Binding und nested Properties - wie im Allgemeinen lösen?

DarthShader

Erfahrenes Mitglied
Hallo zusammen,

ich bin seit längerem auf der Suche nach einer guten Binding Lösung, die es mir erlaubt, Bean properties an andere Bean properties bzw. Swing Components properties zu binden.

Nun gibt es ja eine handvoll bekannter Lösungen, z.B.: Beans Binding (JSR 295), JGoodies Binding, Eclipse Binding, Spring RCP Binding. Einige davon habe ich ausprobiert und denke auch diese gut einsetzen zu können.

Aber zu zwei Problemen kann ich einfach keine gedankliche Brücke schlagen, ich weiß nicht, wie man so etwas handhabt, ob es da Best Practices gibt etc.. Es geht in beiden Fällen um nested properties (ich möchte die klassischen Bound Properties verwenden, also Domain Klassen mit PropertyChangeSupport):


1. Wenn ich das nested property "customer.car.model" binde (das Modell wird z.B. als JLabel in einem Fenster angezeigt), und dann setze ich z.B. "car" neu mit "customer.setCar( new Car() );", dann wird ja für das "car" property ein Event generiert ("firePropertyChange"). Allerdings muss doch auch das Label für das Modell aktualisiert werden, also müsste ja auch automatisch ein Event für alle "Child Properties" gefeuert werden, also ein "firePropertyChange" für das "model" in "customer.car.model".

Soweit ich das jetzt aber gesehen habe, wird das in den Frameworks nicht gemacht, oder habe ich etwas übersehen? Wie also bindet man dann korrekt solche Nested-Properties? Wie löst man dieses Problem in der Praxis?


2. Ebenfalls bezüglich nested Properties - wie handhabt man null-Properties zur Vermeidung von NullPointerExceptions? Nehmen wir wieder das Beispiel "customer.car.model", und nehmen wir weiterhin an, dass das "car" property am Anfang noch "null" ist. Dann kann ich ja "customer.car" oder gar "customer.car.model" gar nicht binden, ist das korrekt? Er würde ja versuchen, ein "PropertyChangeLister" zum "car" hinzuzufügen, was in dem Fall nicht geht.

Was ich aber auf keinen Fall will ist, mein gesamtes Domain Modell durch-zu-instantiieren bevor ich das Binding mache. Mein Domain Model ist relativ groß, und Daten, die nicht angegeben wurden, sollen auch der korrekten Semantik nach "null" bleiben.

Was ich bräuchte wäre ein intelligentes Binding, das Beans automatisch instantiiert, wenn sich auf der anderen Seite des Bindings der Wert ändert. Wenn ich also das Modell des Autos in der GUI setze, dann "merkt" das Binding Framework, dass "customer.car" null ist, erzeugt ein neues Objekt der Klasse "Car", setzt es dem Customer, und aktualisiert dann "customer.car.model".

Hat jemand eine Ahnung, wie man damit umgeht? Kann vielleicht eines der oben genannten Frameworks das?


Ich würde mich wirklich sehr freuen, wenn jemand ein paar Tipps oder Gedanken dazu hat, das sind sicher keine exotischen Probleme, vielleicht gibt es ja wirklich eine Art von Design Pattern bzw. Vorgehensweise, wie man sowas löst. Oder es gibt ein Binding Framework, welches diese zwei Probleme bereits lösen kann, und ich habe es übersehen.


Über Eure Hilfe würde ich mich sehr freuen


Vielen Dank!
 
Zurück