Java Software-Komponenten "JavaBeans" • Warum? – – – – Wiederverwendung Reuse Objektorientierung reicht nicht Kapselung von Funktion, Dokumentation und Ressourcen Zusammensetzen einzelner Komponenten so einfach wie möglich gestalten – Wenn möglich Plattform- und Sprachenunabhängigkeit – Testen und Verifizieren von einzelnen Komponenten – Pool aus Standardkomponenten (z.B. GUI Objekte) • Informationsquellen: – JavaBean Homepage: http://java.sun.com/beans – Sammlungen von JavaBean Komponenten: http://www.alphaworks.ibm.com/alphaBeans http://www.developer.com/directories/pages/dir.java.html – JavaBean Tutorial von Sun: http://www.ssw.uni-linz.ac.at/ Services/Docs/Tutorial/javabeans/index.html – O’Neil, Josef: JavaBeans Programming from the Ground Up, McGraw Hill, 1998, ISBN: 0-07-882477-X Wiederverwendung Objekt - Orientiert • Whitebox Reuse durch Vererbung • Vererbung = Subclassing; erbt Code & Schnittstellen • Anwender muss Doku & fremden Code verstehen • Entwickler gibt sein Know-How preis Komponenten - Orientiert • Blackbox Reuse durch „Zusammenstecken“ • Vererbung = Subtyping; erbt Schnittstellen (COM, nicht OO) • Anwender braucht gute Dokumentation • Möglichkeit von „Try & Buy“ Java Software-Komponenten "JavaBeans" "A Java Bean is a reusable software component that can be manipulated visually in a builder tool“ • JavaBean = Java Objektmodell (Klasse) + Eigenschaften (properties) + Ereignisse (events) + Unterstützung für visuelle Komposition • Design Time versus Run Time • Visible und Invisible Beans • Idee von Ereignissen: Die Änderung eines Zustandes soll allen, die sich dafür interessieren, mitgeteilt werden. • Erlaubt „loosley coupled communication“ • Beans werden über Ereignisse zusammengesteckt Ereignismechanismus e1 Event source e1 Ereignisquelle (event source) Interessent (event listener) • • • Auslöser der Ereignisse Wo ist etwas passiert? benachrichtigt alle Interessenten • wird bei der Quelle registriert und deregistriert reagiert auf Ereignisse Wer will es wissen? Methoden der Ereignisquelle: addMyEventListener( MyEventListener l) removeMyEventListener( MyEventListener l ) fireMyEvent(){ //löse Ereignis für alle MyEventListener aus } Methoden des Ereignisempfängers: interface MyEventListener{ doAction( MyEvent e ){} } Beispiel "AlarmBean" • Alle x Millisekunden wird ein Alarm ausgelöst • AlarmEvent – Enthält die Entstehungszeit des Alarms in Millisekunden • AlarmEventListener – Reagiert auf AlarmEvent – Methode: public void alarmOccurred(AlarmEvent ev) • AlarmBean – Ereignisquelle – Löst alle x Millisekunden den Alarm aus und benachrichtigt die registrierten AlarmEventListener Beispiel "AlarmBean" public class AlarmBean { public addAlarmListener(AlarmListener al) { // ... register al ... } private fireAlarmEvent () { for (all registered listeners l) { l.alarmOccurred (event); } } public removeAlarmListener(AlarmListener l) { ... remove l ... } ... other methods, properties, ... } public class AlarmClock implements AlarmEventListener { public void alarmOccurred(AlarmEvent ev) { this.beep(); } } Attribute "Properties" • kann mittels Code und mittels Editor verändert werden • verändert Aussehen / Verhalten einer Bean – Beispiel: „label“ Eigenschaft eines GUI Knopfes, welches die Beschriftung verändert • kann zur Run Time und zur Design Time gesetzt werden • Es wird immer über öffentliche Methoden zugegriffen – Datenkapsel! – kann in Bean als Instanzvariable gespeichert werden, oder berechnet werden, oder ..... • Namenskonventionen um Eigenschaften von Methoden zu unterscheiden • Eigenschaft: Name: label Typ: String • Namenskonventionen der Zugriffsmethoden: public String getLabel(); public void setLabel(String aLabel); Attribute "Properties" • Simple Property – lesbar – schreibbar • Bound Property – spezielles Ereignis wird nach dem Ändern einer Eigenschaft ausgelöst • Constrained Property – spezielles Ereignis wird vor dem Ändern einer Eigenschaft ausgelöst – es kann ein Veto gegen die geplante Änderung eingelegt werden • Indexed Property – für eine Sammlung von gleichen Eigenschaften (z.B.: URL-Liste) AlarmBean Package Manifest-Version: 1.0 Name: org/merlin/beans/alarm/AlarmBean.class Java-Bean: True