Fundamentale Muster
Schnittstellen
Schnittstellen <ul><li>Schnittstellen abstrahieren vollständig von der Implementierung und schreiben nur Verhalten vor. </...
Ein paar Zahlen <ul><li>Die Java 5.0 Bibliothek definiert insgesamt 3.236 Typen. </li></ul><ul><li>Davon sind 780 Schnitts...
Namensgebung für Schnittstellen <ul><li>Einige Autoren benennen Schnittstellen anders als Klassen, z. B. durch ein vorange...
Namensgebung für Schnittstellen <ul><li>Trotz Bewunderung für Eclipse und .NET sollte darauf verzichtet werden: </li></ul>...
Interface/Implementation Pair <ul><li>Schnittstellen sind wichtig, da sie lediglich Operationen beschreiben, aber nicht im...
Beispiele für das I/I-Pair bei Swing <ul><li>Bei den Modellen in Swing ist ein Beispiel für das I/I-Pair zu sehen;  ListMo...
Aufgabe <ul><li>Wie viele Klassen (überschlagen) gibt es in Java, die mit „Abstract“ beginnen? </li></ul><ul><ul><li>Ist a...
Union-Pattern <ul><li>Die Vereinigung von gemeinsamen Eigenschaften in einer Oberklasse oder Schnittstelle nennt sich  Uni...
Programmieren gegen Schnittstellen
Schnittstellen-orientierte Programmierung <ul><li>Programmieren gegen Schnittstellen , auch  Schnittstellen-orientierte Pr...
Schnittstellen und Implementierung <ul><li>Der Typ der Objektvariablen sollte der allgemeinste sein, der sich finden lässt...
Klassen: Kleinstmöglicher Typ <ul><li>Referenzvariablen sollen mit dem kleinstmöglichen Typ definiert werden. </li></ul><u...
Aufgabe <ul><li>Wie lautet der kleinste Typ für die folgenden Datenstrukturen: </li></ul><ul><li>1. HashMap m = new HashMa...
Fabriken <ul><li>Der vorherrschende Typ mag eine Schnittstelle sein, aber zu einem konkreten Zeitpunkt muss es eine Klasse...
Aufgabe <ul><li>Wie viele Klassen definiert die Pakete? </li></ul><ul><ul><li>org.w3c.dom </li></ul></ul><ul><ul><li>java....
Aufgabe <ul><li>Um Klassen und Schnittstellen zu trennen, können Klassen mit „Impl“ enden oder eine Namensgebung wie Eclip...
Markierungsschnittstellen
Markierungsschnittstellen <ul><li>Eine  Markierungsschnittelle  (engl.  marker interface ), auch  Tag-Interface , ist eine...
Aufgabe <ul><li>Was ist die Aufgabe der folgenden Markierungsschnittstellen? </li></ul><ul><ul><li>java.io.Serializable </...
Wert von Markierungsschnittstellen <ul><li>Über die Implementierung bekommt die Klasse einen neuen Typ, der sich mit  inst...
Markierungsschnittstelle RandomAccess <ul><li>ArrayList  und  Vector  erlauben schnellen wahlfreien Zugriff über  get(inde...
Aufgabe <ul><li>Wo nutzt  Collections  den Typ  RandomAccess ? </li></ul><ul><ul><li>Suche in Eclipse nach dem Auftreten. ...
Markieren in Java 5 <ul><li>Seit Java 5 gibt es Annotationen, die ebenfalls eine Markierung erlauben. </li></ul><ul><ul><l...
Delegate/Delegation
Delegation <ul><li>Unter  Delegation  versteht man das Weiterleiten an Hilfsklassen zum Erreichen der eigenen Ziele. </li>...
Immutable
Immutable Pattern <ul><li>Können Objekte ihren Zustand nicht ändern, so spricht man von  immutable-Objekten . </li></ul><u...
Aufgabe <ul><li>Welche Objekte sind immutable? </li></ul><ul><ul><li>Integer </li></ul></ul><ul><ul><li>Void </li></ul></u...
Immutable-Objekte verwalten <ul><li>Die Java-Bibliothek hat neben einigen immutable-Klassen auch Beispiele für Pools, die ...
Aufgabe <ul><li>Was ist an folgendem Programm ungünstig? </li></ul><ul><li>class Person </li></ul><ul><li>{ </li></ul><ul>...
Neue Objekte für die Rückgabe <ul><li>Beispiel: Eine Person gibt über die Referenz Zugriff auf interne Variablen. Ein Aufr...
Immutable Interface <ul><li>Eine Lösung wäre, eine eigene Schnittstelle zu definieren, in der es nur Lese-Funktionen gibt....
Aufgabe <ul><li>Ist in diesem Programm alles OK? </li></ul><ul><li>class Person </li></ul><ul><li>{ </li></ul><ul><li>  pr...
Aufgabe <ul><li>Was ist nicht korrekt? </li></ul><ul><li>class Clazz { </li></ul><ul><li>  private List list; </li></ul><u...
Stateful oder Stateless Session Beans <ul><li>Im Bereich der Enterprise Java Beans gibt es drei Gruppen: </li></ul><ul><ul...
Null-Objekte
Null-Objekt-Muster <ul><li>Ein  Null-Objekt , auch  Stub  genannt, implementiert eine Schnittstelle ohne Funktionalität. <...
Aufgabe <ul><li>Wenn es für  Collection -Klassen schon Konstanten gibt, warum dann nicht für primitive Felder? </li></ul><...
Aufgabe <ul><li>Zum Loggen soll ein  NullWriter  alle Eingaben verwerfen. Wie sieht die Implementierung aus? </li></ul>
Collecting Parameter Pattern
Collecting Parameter Pattern <ul><li>Wenn eine Methode ein Ergebnis liefert, wird oft eine Rückgabe genutzt. </li></ul><ul...
Ergebnisse einsammeln <ul><li>Die genannte Anwendung ist ein Sonderfall von Sammler. </li></ul><ul><ul><li>Im Allgemeinen ...
Aufgabe <ul><li>Java 5 sieht die Schnittstelle  java.lang.Appendable  vor, die als Parametertyp sehr gut verwendet werden ...
JavaBeans
Attribute sind privat <ul><li>Öffentliche Attribute machen viele Probleme: </li></ul><ul><ul><li>Die Typen sind später sch...
Bean Pattern <ul><li>Eine  JavaBean  ist eine Komponente mit  Properties . Sie </li></ul><ul><ul><li>hat einen öffentliche...
Orte, wo man Beans findet <ul><li>Gui-Builder.  Properties werden vom Gui-Builder automatisch ausgelesen und visualisiert....
Vorteile der Zugriffsmethoden <ul><li>Gegenüber direktem Attributzugriff haben Setter/Getter einige Vorteile: </li></ul><u...
Späte Initialisierung <ul><li>Mit später Initialisierung bedeutet, dass ein Attribut nicht im Konstruktor initialisiert wi...
Aufgabe <ul><li>Wie lässt sich die Klasse mit später Initialisierung umschreiben? </li></ul><ul><li>class Person </li></ul...
Aufgabe <ul><li>Diskutiere die Möglichkeit der späten Initialisierung bei grafischen Oberflächen über die drei Techniken <...
Ereignisse <ul><li>Zwar sind JavaBeans relativ einfach, doch die aktuelle Spezifikation ist immerhin 114 Seiten lang. </li...
Aufgabe <ul><li>Suche in der API-Dokumentation die Klasse  java.beans.PropertyChangeSupport . Sie bietet Unterstützung für...
Aufgabe <ul><li>Beans Binding (JSR 295)  bietet eine Möglichkeit, Änderungen von Bean-Zuständen zu überwachen und Zustands...
Nachteile der Bean-Methoden <ul><li>Der Aufbau einer initialisierten Bean sieht immer gleich aus: </li></ul><ul><ul><li>Ba...
Der Begriff „Model-Objekt“ <ul><li>Unter einem  Model-Objekt (MO)  versteht man ein relativ dummes Objekt, welches </li></...
„Große“ Konstruktoren <ul><li>Handelt es sich nicht um ein immutable-Objekt, kann es durch mehrere  setXXX() -Methoden ini...
Argumenten-Sammler <ul><li>Abhilfe schaffen kann hier der Argumenten-Sammler: </li></ul><ul><ul><li>Modifikationsfunktione...
Professionelle IT-Qualifizierung
tutego über tutego <ul><li>Inhouse-Schulungen mit individualisierten Inhalten und Terminauswahl </li></ul><ul><li>190 Semi...
Unsere Themen
Unsere Themen
Upcoming SlideShare
Loading in...5
×

Fundamentale Muster in Java

3,734

Published on

Published in: Technology, News & Politics
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,734
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide
  • #toc1
  • #toc2
  • http://c2.com/cgi/wiki?DontDistinguishBetweenClassesAndInterfaces
  • Nicht abstrakt
  • #toc2
  • #index Programmieren gegen Schnittstellen #index Schnittstellen-orientierte Programmierung
  • #toc2
  • #index RandomAccess, Schnittstelle
  • #toc2
  • #toc2
  • #toc2
  • #toc2
  • #toc2
  • #index JavaBean
  • #index PropertyChangeSupport
  • #index Model-Objekt (MO)
  • http://www.davethehat.com/articles/aa.pdf
  • Transcript of "Fundamentale Muster in Java"

    1. 1. Fundamentale Muster
    2. 2. Schnittstellen
    3. 3. Schnittstellen <ul><li>Schnittstellen abstrahieren vollständig von der Implementierung und schreiben nur Verhalten vor. </li></ul><ul><ul><li>Die implementierenden Klassen definieren dann das Verhalten. </li></ul></ul><ul><li>In UML – aber nicht in Java – werden Begriffe getrennt: </li></ul><ul><ul><li>Operationen Definieren eine Schnittstelle </li></ul></ul><ul><ul><li>Methoden Konkrete Implementierungen </li></ul></ul>
    4. 4. Ein paar Zahlen <ul><li>Die Java 5.0 Bibliothek definiert insgesamt 3.236 Typen. </li></ul><ul><li>Davon sind 780 Schnittstellen. </li></ul><ul><li>Also sind mehr als ¼ der Typen Schnittstellen. </li></ul><ul><ul><li>Das unterstreicht die Bedeutung der Schnittstellen! </li></ul></ul>
    5. 5. Namensgebung für Schnittstellen <ul><li>Einige Autoren benennen Schnittstellen anders als Klassen, z. B. durch ein vorangestelltes „I“ oder angehängtes „IF“. </li></ul><ul><ul><li>Eclipse RCP: ISelection , ILabelProvider , IModificationDate . </li></ul></ul><ul><ul><li>Oder .NET: ICloneable , IComparable , IFormattable . </li></ul></ul>
    6. 6. Namensgebung für Schnittstellen <ul><li>Trotz Bewunderung für Eclipse und .NET sollte darauf verzichtet werden: </li></ul><ul><ul><li>Schnittstellen existieren nur, da Java keine Mehrfachvererbung anbietet. </li></ul></ul><ul><ul><li>Abstrakte Klassen sind nicht besonders gekennzeichnet und Schnittstellen sehr ähnlich . </li></ul></ul><ul><ul><li>Refaktorings von Klassen und Schnittstellen sind einfacher, da keine Bezeichnernamen geändert werden müssen. </li></ul></ul><ul><ul><li>Die Unterscheidung ist nur bei der Erzeugung wichtig. </li></ul></ul><ul><ul><li>Eine IDE gibt die Info sowieso. (In Eclipse: F4) </li></ul></ul>
    7. 7. Interface/Implementation Pair <ul><li>Schnittstellen sind wichtig, da sie lediglich Operationen beschreiben, aber nicht implementieren. </li></ul><ul><ul><li>Der Variablentyp sollte daher eine Schnittstelle sein, um später flexibler den konkreten Typ austauschen zu können. </li></ul></ul><ul><li>Der Nachteil einer Schnittstelle ist aber, dass sie keine Default-Implementierung haben kann. </li></ul><ul><ul><li>Neben der Schnittstelle eine abstrakte Klasse einfügen, die sie implementiert und so weit alles ausprogrammiert, was sinnvoll ist. </li></ul></ul><ul><ul><li>Die Basisimplementierung bezeichnet den zweiten Teil der Schnittstelle, daher Interface/Implementation Pair . </li></ul></ul>
    8. 8. Beispiele für das I/I-Pair bei Swing <ul><li>Bei den Modellen in Swing ist ein Beispiel für das I/I-Pair zu sehen; ListModel ist das Listen-Model für die JList und TableModel das Model für die JTable . </li></ul><ul><li>Abstrakte Basisklassen mit einer Teilimplementierung beginnen mit Abstract. </li></ul><ul><ul><li>AbstractListModel und AbstractTableModel implementieren den An-/Abmeldeteil der Listener. </li></ul></ul><ul><li>Vollständige Implementierungen beginnen mit Default. </li></ul><ul><ul><li>DefaultListModel ist eine konkrete Klasse, die sich als ListModel verwenden lässt. </li></ul></ul>
    9. 9. Aufgabe <ul><li>Wie viele Klassen (überschlagen) gibt es in Java, die mit „Abstract“ beginnen? </li></ul><ul><ul><li>Ist auch AbstractList ein Beispiel für ein I/I-Paar? </li></ul></ul><ul><li>Wie viele Klassen beginnen (überschlagen) mit „Default“? </li></ul><ul><li>Was fällt bei den „Default“-Klassen mehr auf als bei den „Abstract“-Klassen? </li></ul>
    10. 10. Union-Pattern <ul><li>Die Vereinigung von gemeinsamen Eigenschaften in einer Oberklasse oder Schnittstelle nennt sich Union-Pattern . </li></ul><ul><ul><li>Sie ist eine notwendige Operation im Design. </li></ul></ul><ul><li>Beispiel: Ein Abspieler von MP3-Dateien hat die gleichen Methoden wie ein Abspieler von WAV-Dateien. </li></ul><ul><ul><li>Diese Gemeinsamkeiten beschreibt eine Schnittstelle Abspieler zum Beispiel mit den Methoden play() oder stop() . </li></ul></ul>
    11. 11. Programmieren gegen Schnittstellen
    12. 12. Schnittstellen-orientierte Programmierung <ul><li>Programmieren gegen Schnittstellen , auch Schnittstellen-orientierte Programmierung genannt, ist eines der wichtigsten Designziele. </li></ul><ul><li>Im erstes Kapitel des Design-Pattern Buches der GoF findet man: </li></ul><ul><li>“ This so greatly reduces implementation dependencies between subsystems that it leads to the following principle of reusable object-oriented design: </li></ul><ul><li>Program to an interface, not an implementation. </li></ul><ul><li>Don't declare variables to be instances of particular concrete classes. Instead, commit only to an interface defined by an abstract class. You will find this to be a common theme of the design patterns in this book.” </li></ul>
    13. 13. Schnittstellen und Implementierung <ul><li>Der Typ der Objektvariablen sollte der allgemeinste sein, der sich finden lässt. </li></ul><ul><li>Wenn Klassen Schnittstellen implementieren, wird der Typ oft eine Schnittstelle sein. </li></ul><ul><ul><li>Im Design sollten Schnittstellen das Verhalten definieren und den Typ von Variablen bestimmen. </li></ul></ul><ul><li>Die Collection-API zeigt das vorbildlich: </li></ul><ul><ul><li>Schnittstellen wie Collection und Unterschnittstellen List , Map , Set definieren Eigenschaften. </li></ul></ul><ul><ul><li>Konkrete Klassen, wie ArrayList , HashMap implementieren die Operationen. </li></ul></ul><ul><li>ArrayList l = new ArrayList(); wird zu </li></ul><ul><li>List l = new ArrayList(); </li></ul>
    14. 14. Klassen: Kleinstmöglicher Typ <ul><li>Referenzvariablen sollen mit dem kleinstmöglichen Typ definiert werden. </li></ul><ul><ul><li>Das drückt aus: Wir brauchen nur eine kleine Schnittstelle. </li></ul></ul><ul><li>Beispiel: Bei vielen Dekoratoren in java.io ist der tatsächliche Typ uninteressant. </li></ul><ul><li>FileInputSteam fis = new FileInputStream(file); </li></ul><ul><li>BufferedInputStream bis = new BufferedInputStream(fis); </li></ul><ul><li>GzipInputStream gzis = new GzipInputStream(bis); </li></ul><ul><li>wird zu </li></ul><ul><li>InputSteam fis = new FileInputStream( file ); </li></ul><ul><li>InputStream bis = new BufferedInputStream( fis ); </li></ul><ul><li>InputStream gzis = new GzipInputStream( bis ); </li></ul>
    15. 15. Aufgabe <ul><li>Wie lautet der kleinste Typ für die folgenden Datenstrukturen: </li></ul><ul><li>1. HashMap m = new HashMap(); </li></ul><ul><li>m.put( &quot;tutege&quot;, &quot;IT-Schulungen&quot; ); </li></ul><ul><li>2. ArrayList l = new ArrayList(); </li></ul><ul><li>l.add( &quot;tutego&quot; ); </li></ul><ul><li>3. LinkedList l = new LinkedList(); </li></ul><ul><li>ListIterator iter = l.listIterator(); </li></ul><ul><li>4. LinkedList l = new LinkedList(); </li></ul><ul><li>Object o = l.poll(); </li></ul><ul><li>Gibt es eine Möglichkeit in Eclipse, diesen kleinsten Typ zu erfahren? Tipp: Schaue im Kontextmenü Refactoring . </li></ul>
    16. 16. Fabriken <ul><li>Der vorherrschende Typ mag eine Schnittstelle sein, aber zu einem konkreten Zeitpunkt muss es eine Klasse sein: </li></ul><ul><ul><li>Um Objekte zu erzeugen. </li></ul></ul><ul><li>Hier steckt also eine Fabrik hinter dem Szenario. </li></ul>
    17. 17. Aufgabe <ul><li>Wie viele Klassen definiert die Pakete? </li></ul><ul><ul><li>org.w3c.dom </li></ul></ul><ul><ul><li>java.sql </li></ul></ul><ul><li>http://xerces.apache.org/xerces2-j/javadocs/xerces2/ zeigt eine API-Dokumentation der Xerces-Klassen, also der Implementierung der XML-API. </li></ul><ul><ul><li>Wie verhalten sich Schnittstellen und Implementierung zentraler Klassen wie Text und TextImpl ? </li></ul></ul><ul><ul><li>Zeichne ein UML-Diagramm der Klassen und Schnittstellen. </li></ul></ul>
    18. 18. Aufgabe <ul><li>Um Klassen und Schnittstellen zu trennen, können Klassen mit „Impl“ enden oder eine Namensgebung wie Eclipse nutzen. </li></ul><ul><ul><li>http://www.eclipse.org/articles/Article-API%20use/ eclipse-api-usage-rules.html </li></ul></ul><ul><li>In Java hat sich für die Implementierung der API auch ein anderes Wort eingebürgert, welches in der Paketstruktur auch häufig fällt. Welches? Lese dazu </li></ul><ul><ul><li>http://jakarta.apache.org/cactus/participating/apis.html </li></ul></ul><ul><li>Zum Weiterlesen: </li></ul><ul><ul><li>http://artima.com/lejava/articles/designprinciples.html </li></ul></ul>
    19. 19. Markierungsschnittstellen
    20. 20. Markierungsschnittstellen <ul><li>Eine Markierungsschnittelle (engl. marker interface ), auch Tag-Interface , ist eine Schnittstelle ohne Operationen. </li></ul><ul><ul><li>Die Implementierung der Schnittstelle macht „keinen“ Aufwand. </li></ul></ul>
    21. 21. Aufgabe <ul><li>Was ist die Aufgabe der folgenden Markierungsschnittstellen? </li></ul><ul><ul><li>java.io.Serializable </li></ul></ul><ul><ul><li>java.rmi.Remote </li></ul></ul><ul><ul><li>java.util.EventListener </li></ul></ul><ul><ul><li>java.lang.Cloneable </li></ul></ul><ul><ul><li>java.security.KeyStore.Entry </li></ul></ul>
    22. 22. Wert von Markierungsschnittstellen <ul><li>Über die Implementierung bekommt die Klasse einen neuen Typ, der sich mit instanceof testen lässt. </li></ul><ul><ul><li>Soll ein Objekt über einen ObjectOutputStream serialisiert werden, so testet die writeObject() -Methode zuerst, ob das Objekt instanceof Serializable ist. </li></ul></ul><ul><li>Ein Nachteil von Markierungsschnittstellen könnte sein: </li></ul><ul><ul><li>Durch die Implementierung bzw. Erweiterung bekommt der Typ inklusive aller Untertypen diese Markierung. </li></ul></ul><ul><ul><li>Wie die Vererbung ist auch eine Markierung starr. Sie kann nicht zur Laufzeit gesetzt und ausgeschaltet werden. </li></ul></ul>
    23. 23. Markierungsschnittstelle RandomAccess <ul><li>ArrayList und Vector erlauben schnellen wahlfreien Zugriff über get(index) . </li></ul><ul><ul><li>LinkedList erlaubt zwar auch wahlfreien Zugriff, aber keinen schnellen! </li></ul></ul><ul><li>java.util.RandomAccess ist eine interessante Schnittstelle, die Klassen implementiert, die schnellen, wahlfreien Zugriff auf die Elemente ermöglichen. </li></ul><ul><ul><li>ArrayList und Vector implementieren diese Schnittstelle. </li></ul></ul><ul><li>Methoden können mit instanceof testen, ob die Liste schnell Elemente mit get(index) liefern kann. </li></ul>
    24. 24. Aufgabe <ul><li>Wo nutzt Collections den Typ RandomAccess ? </li></ul><ul><ul><li>Suche in Eclipse nach dem Auftreten. </li></ul></ul>
    25. 25. Markieren in Java 5 <ul><li>Seit Java 5 gibt es Annotationen, die ebenfalls eine Markierung erlauben. </li></ul><ul><ul><li>Neben den Typen lassen sich auch Methoden annotieren. </li></ul></ul><ul><li>@Override </li></ul><ul><li>public String toString() </li></ul><ul><li>Hier wird die Methode toString() als überschrieben gekennzeichnet. </li></ul>
    26. 26. Delegate/Delegation
    27. 27. Delegation <ul><li>Unter Delegation versteht man das Weiterleiten an Hilfsklassen zum Erreichen der eigenen Ziele. </li></ul><ul><li>Delegation ist neben Vererbung ein wichtiges Konzept der Wiederverwendung von Klassen. </li></ul>
    28. 28. Immutable
    29. 29. Immutable Pattern <ul><li>Können Objekte ihren Zustand nicht ändern, so spricht man von immutable-Objekten . </li></ul><ul><ul><li>String-Objekte sind zum Beispiel immutable, da man die Zeichen eines String-Objektes nicht ändern kann. </li></ul></ul><ul><ul><li>Weitere Beispiele sind: Wrapper-Objekte, Font -Objekte, Color -Objekte, File -Objekte. </li></ul></ul><ul><li>Immutable-Objekte haben den Vorteil, dass sie problemlos in einem Pool gehalten werden können. </li></ul><ul><li>Zwei Eigenschaften sind für immutable-Objekte die Regel: </li></ul><ul><ul><li>Sie haben getXXX() -, aber keine setXXX() -Methoden. </li></ul></ul><ul><ul><li>Sie haben keinen Standard-Konstruktor, sondern nehmen den Zustand über einen parametrisierten Konstruktor an. </li></ul></ul><ul><li>Immutable-Objekt fallen in der Analyse-/Design-Phase auf. </li></ul>
    30. 30. Aufgabe <ul><li>Welche Objekte sind immutable? </li></ul><ul><ul><li>Integer </li></ul></ul><ul><ul><li>Void </li></ul></ul><ul><ul><li>String </li></ul></ul><ul><ul><li>StringBuffer </li></ul></ul><ul><ul><li>Font </li></ul></ul><ul><ul><li>Color </li></ul></ul><ul><ul><li>File </li></ul></ul><ul><ul><li>Date </li></ul></ul><ul><ul><li>BigInteger , BigDecimal </li></ul></ul>
    31. 31. Immutable-Objekte verwalten <ul><li>Die Java-Bibliothek hat neben einigen immutable-Klassen auch Beispiele für Pools, die immutable-Objekte speichern. </li></ul><ul><li>Besonders interessant ist seit Java 5.0 die neue Methode Integer.valueOf(int) , die an Stelle des Konstruktors Integer(int) verwendet werden sollte. </li></ul><ul><li>Für eigene Pools eignen sich Assoziativspeicher wie HashMap gut. </li></ul><ul><li>Interessant ist auch die WeakHashMap , die Elemente löscht, wenn der Speicher knapp wird. </li></ul>
    32. 32. Aufgabe <ul><li>Was ist an folgendem Programm ungünstig? </li></ul><ul><li>class Person </li></ul><ul><li>{ </li></ul><ul><li> private StringBuffer name; </li></ul><ul><li> public StringBuffer getName() { </li></ul><ul><li> return name; </li></ul><ul><li> } </li></ul><ul><li>} </li></ul>
    33. 33. Neue Objekte für die Rückgabe <ul><li>Beispiel: Eine Person gibt über die Referenz Zugriff auf interne Variablen. Ein Aufrufer könnte den Zustand ändern. </li></ul><ul><li>Das Problem kann mit einer Kopie gelöst werden. </li></ul><ul><ul><li>Es ist eine gute Idee, clone() zu implementiert. Dem Aufrufer muss die Semantik klar sein, dass er im Fall einer Änderung auf einer Kopie arbeitet. </li></ul></ul><ul><ul><li>Für StringBuffer kann das Objekt auch in ein String -Objekt konvertiert werden – das ist immutable. </li></ul></ul><ul><li>public StringBuffer getName() { // 1. Lösung </li></ul><ul><li> return name.clone(); </li></ul><ul><li>} </li></ul><ul><li>public String getName() { // 2. Lösung </li></ul><ul><li> return name.toString(); </li></ul><ul><li>} </li></ul>
    34. 34. Immutable Interface <ul><li>Eine Lösung wäre, eine eigene Schnittstelle zu definieren, in der es nur Lese-Funktionen gibt. </li></ul><ul><li>Eine implementierende Klasse fügt dann die Setter hinzu. </li></ul><ul><li>Im Fall von String / StringBuffer / StringBuilder haben wir bereits eine Schnittstelle: CharSequence . </li></ul><ul><li>public CharSequence getName() { </li></ul><ul><li> return name; </li></ul><ul><li>} </li></ul><ul><li>Doch ein Problem bleibt: Der Aufrufer kann den Quellcode, also den ursprünglichen Typ StringBuffer , sehen und durch eine Typanpassung wieder herstellen. </li></ul><ul><ul><li>Dies lässt sich durch den Bau eines Dekorators vermeiden. </li></ul></ul>
    35. 35. Aufgabe <ul><li>Ist in diesem Programm alles OK? </li></ul><ul><li>class Person </li></ul><ul><li>{ </li></ul><ul><li> private Date birthday; </li></ul><ul><li> Person( Date birthday ) { </li></ul><ul><li> this.birthday = birthday; </li></ul><ul><li> } </li></ul><ul><li> public Date getBirthday() { </li></ul><ul><li> return birthday; </li></ul><ul><li> } </li></ul><ul><li>} </li></ul>
    36. 36. Aufgabe <ul><li>Was ist nicht korrekt? </li></ul><ul><li>class Clazz { </li></ul><ul><li> private List list; </li></ul><ul><li> private int[] array; </li></ul><ul><li> List getList() { </li></ul><ul><li> return list; </li></ul><ul><li> } </li></ul><ul><li> int[] getArray() { </li></ul><ul><li>return array; </li></ul><ul><li> } </li></ul><ul><li>} </li></ul>
    37. 37. Stateful oder Stateless Session Beans <ul><li>Im Bereich der Enterprise Java Beans gibt es drei Gruppen: </li></ul><ul><ul><li>Session Beans, Entity Beans, Message Driven Beans </li></ul></ul><ul><li>Die Session Beans sind weiterhin in Stateless Session Beans und Stateful Session Beans unterteilt. </li></ul><ul><ul><li>Stateless Session Beans haben keinen Zustand und sind damit immutable. Der Container braucht nur ein einziges Objekt aufzubauen, was dann von allen Clients verwendet wird. </li></ul></ul><ul><ul><li>Bei Stateful Session Beans besitzen einen Zustand. </li></ul></ul><ul><li>Auch Entity Beans haben immer einen Zustand und können nicht geteilt werden. </li></ul><ul><li>Message Driven Beans haben ebenfalls keinen Zustand. </li></ul>
    38. 38. Null-Objekte
    39. 39. Null-Objekt-Muster <ul><li>Ein Null-Objekt , auch Stub genannt, implementiert eine Schnittstelle ohne Funktionalität. </li></ul><ul><li>Null-Objekte sind immutable! </li></ul><ul><li>Für Datenstrukturen der Collection-API gibt es bereits leere Sammlungen: </li></ul><ul><ul><li>Collections.EMPTY_LIST , EMPTY_MAP , EMPTY_SET </li></ul></ul><ul><ul><li>Collections.emptyList() , emptyMap() , emptySet() </li></ul></ul>
    40. 40. Aufgabe <ul><li>Wenn es für Collection -Klassen schon Konstanten gibt, warum dann nicht für primitive Felder? </li></ul><ul><li>Die Klasse java.util.Collections verweist mit den statischen Variablen EMPTY_LIST , EMPTY_MAP und EMPTY_SET auf Null-Objekte, die die Schnittstellen für Listen, Assoziativspeicher und Mengen ohne Logik implementieren. </li></ul><ul><ul><li>Warum benötigt man für Listen/Mengen/Maps zwei Möglichkeiten, etwa Collections.emptyList vs. Collections.EMPTY_LIST ? </li></ul></ul>
    41. 41. Aufgabe <ul><li>Zum Loggen soll ein NullWriter alle Eingaben verwerfen. Wie sieht die Implementierung aus? </li></ul>
    42. 42. Collecting Parameter Pattern
    43. 43. Collecting Parameter Pattern <ul><li>Wenn eine Methode ein Ergebnis liefert, wird oft eine Rückgabe genutzt. </li></ul><ul><li>int max = Math.max( 13, 34 ); </li></ul><ul><li>Dimension d = new JButton().getSize(); </li></ul><ul><li>Es gibt allerdings auch eine andere Möglichkeit, eine Rückgabe zum Aufrufer zu transportieren. </li></ul><ul><li>Mit dem Collecting Parameter Pattern wird ein gefülltes Objekt übergeben – eine Rückgabe ist nicht nötig. </li></ul><ul><li>Dimension d = new Dimension(); </li></ul><ul><li>new JButton().getSize( d ); </li></ul><ul><li>new JTree().getSize( d ); </li></ul><ul><li>Der Vorteil hier: Ein Objekt kann recycled werden, ein vielleicht teures Anlegen wird unnötig. </li></ul>
    44. 44. Ergebnisse einsammeln <ul><li>Die genannte Anwendung ist ein Sonderfall von Sammler. </li></ul><ul><ul><li>Im Allgemeinen wird eine Datenstruktur ( List , StringBuffer , OutputStream , …) mitgegeben, deren Methode bei jedem Aufruf Dinge hinzufügt. </li></ul></ul><ul><li>Auf diese Weise lassen sich sehr schön rekursive Aufrufe realisieren, die ein Ergebnis aufbauen, etwa im Fall von XML. </li></ul><ul><ul><li>Eine Schnittstelle XmlWritable schreibt eine Methode writeXml(PrintWriter) vor. </li></ul></ul><ul><ul><li>Alle Klassen, die ihre Daten in einen XML-Datenstrom schreiben wollen, implementieren diese Methode. </li></ul></ul><ul><ul><li>Innerhalb der Methode writeXml() schreibt das Element die eigenen Daten und ruft die writeXml() -Methode Unterelemente auf. </li></ul></ul>
    45. 45. Aufgabe <ul><li>Java 5 sieht die Schnittstelle java.lang.Appendable vor, die als Parametertyp sehr gut verwendet werden kann. </li></ul><ul><ul><li>Wie sieht damit das Schreiben von XML-Bäumen aus? </li></ul></ul>
    46. 46. JavaBeans
    47. 47. Attribute sind privat <ul><li>Öffentliche Attribute machen viele Probleme: </li></ul><ul><ul><li>Die Typen sind später schwer zu ändern ( double auf int ). </li></ul></ul><ul><ul><li>Wertebereiche können nicht überprüft werden (alter > 0). </li></ul></ul><ul><ul><li>Abhängigkeiten können nicht überwacht werden. </li></ul></ul><ul><ul><li>Änderungen der internen Arbeitsweise sind schwierig (Punkt von kartesischen Koordinatensystem auf Winkelkoordinaten). </li></ul></ul><ul><li>Besser ist, die Attribute privat zu machen und Zugriffsfunktionen anzubieten. </li></ul><ul><li>Doch: Wenn die oberen Punkte nicht zutreffen, können für Werteobjekte die Attribute durchaus öffentlich sein! </li></ul>
    48. 48. Bean Pattern <ul><li>Eine JavaBean ist eine Komponente mit Properties . Sie </li></ul><ul><ul><li>hat einen öffentlichen Konstruktor, </li></ul></ul><ul><ul><li>definiert setXXX() - und getXXX() -Methoden nach einem speziellen Schema und </li></ul></ul><ul><ul><li>implementiert (mitunter) java.io.Serializable . </li></ul></ul><ul><ul><li>Strings sollten mit &quot;&quot; vorbelegt sein. </li></ul></ul><ul><li>Die Bean hält Daten privat und erlaubt nur über Zugriffs- und Modifikationsfunktionen Datenzugriff. </li></ul><ul><ul><li>Das ist der oft gewollte Zugriffschutz. </li></ul></ul><ul><li>Die einfachen Setter und Getter haben folgendes Format für eine Property von einem gegebenen Typ. </li></ul><ul><ul><li>void setProperty( Typ property ) </li></ul></ul><ul><ul><li>Typ getProperty() </li></ul></ul>
    49. 49. Orte, wo man Beans findet <ul><li>Gui-Builder. Properties werden vom Gui-Builder automatisch ausgelesen und visualisiert. Der Gui-Builder stellt die Zustände da (indem er die passende getXXX() -Methode aufruft) und ermöglicht es, die Eigenschaften zu ändern (dann wird das Gui-Tool die setXXX() Methode aufrufen). </li></ul><ul><li>Persistenz-Frameworks. Frameworks wie JPA oder Hibernate nehmen reguläre Java-Objekte (Plain Old Java Objects, POJOs) und bilden sie auf Relationen einer Datenbank ab. Metadaten bestimmen, wie Properties eines Objekts auf Spalten einer Tabelle abgebildet werden. </li></ul><ul><li>Object-XML-Mapper. Abbilden von Exemplaren auf XML-Dokumente. </li></ul>
    50. 50. Vorteile der Zugriffsmethoden <ul><li>Gegenüber direktem Attributzugriff haben Setter/Getter einige Vorteile: </li></ul><ul><ul><li>Sie können Variablen spät initialisieren, also erst dann, wenn der erste getXXX() - oder setXXX() -Aufruf stattfindet. </li></ul></ul><ul><ul><li>Können parallelen Zugriff regeln, also das Objekt bei setXXX() oder getXXX() so lange locken, bis die Operation zu Ende ist. (Zugriff eines Threads auf eine Objektvariable kann nebenläufig zum Problem werden.) </li></ul></ul><ul><ul><li>Unterklassen können die Methoden überschreiben und so das Verhalten redefinieren. </li></ul></ul>
    51. 51. Späte Initialisierung <ul><li>Mit später Initialisierung bedeutet, dass ein Attribut nicht im Konstruktor initialisiert wird, sondern beim ersten Zugriff, wie getXXX() . </li></ul><ul><li>Die späte Initialisierung von Attributen löst zwei Probleme: </li></ul><ul><ul><li>Ein Attribut ist in der Erzeugung teuer und das sollte so lange wie möglich aufgeschoben werden. </li></ul></ul><ul><ul><li>Ein Attribut ist relativ unwichtig und selten gefragt. </li></ul></ul>
    52. 52. Aufgabe <ul><li>Wie lässt sich die Klasse mit später Initialisierung umschreiben? </li></ul><ul><li>class Person </li></ul><ul><li>{ </li></ul><ul><li>private List<Person> friends = </li></ul><ul><li>new ArrayList<Person>(); </li></ul><ul><li>public addFriend( Person p ) { ... } </li></ul><ul><li>public List<Person> getFriends() { ... } </li></ul><ul><li>} </li></ul>
    53. 53. Aufgabe <ul><li>Diskutiere die Möglichkeit der späten Initialisierung bei grafischen Oberflächen über die drei Techniken </li></ul><ul><ul><li>immer bauen, </li></ul></ul><ul><ul><li>bei der ersten Anfrage bauen </li></ul></ul><ul><ul><li>im Hintergrund immer bauen. </li></ul></ul>
    54. 54. Ereignisse <ul><li>Zwar sind JavaBeans relativ einfach, doch die aktuelle Spezifikation ist immerhin 114 Seiten lang. </li></ul><ul><ul><li>http://java.sun.com/products/javabeans/docs/spec.html </li></ul></ul><ul><li>Neben den Properties, auf die Setter und Getter zugreifen, gibt es noch die Ereignisse. </li></ul><ul><ul><li>Die Spezifikation definiert die Namenskonvention bei Listenern. </li></ul></ul><ul><li>Eine Setter kann mit einem Ereignis eine Änderung melden. </li></ul><ul><ul><li>Ein PropertyChangeEvent -Objekt wird bei einer sog. „bound“ oder „constrained“ Property verschickt. </li></ul></ul><ul><ul><li>Diese Änderungen werden aktiv von Binding-Frameworks genutzt. </li></ul></ul>
    55. 55. Aufgabe <ul><li>Suche in der API-Dokumentation die Klasse java.beans.PropertyChangeSupport . Sie bietet Unterstützung für das An-/Abmelden der Listener und das Feuern der Ereignisse. </li></ul><ul><li>Suche auf http://koders.com nach einer Beispiel-Bean, die PropertyChangeSupport nutzt. </li></ul><ul><ul><li>Etwa DatabasePart.java </li></ul></ul>
    56. 56. Aufgabe <ul><li>Beans Binding (JSR 295) bietet eine Möglichkeit, Änderungen von Bean-Zuständen zu überwachen und Zustandsänderungen automatisch auf andere Beans zu übertragen. </li></ul><ul><li>Besuche die Webseite https://beansbinding.dev.java.net/ und finde auf Shannon Hickeys Blog ein Beispiel. </li></ul>
    57. 57. Nachteile der Bean-Methoden <ul><li>Der Aufbau einer initialisierten Bean sieht immer gleich aus: </li></ul><ul><ul><li>Baue mit dem Standard-Konstruktor ein „nacktes“ Objekt </li></ul></ul><ul><ul><li>und setze dann die Zustände mit setXXX() -Methoden. </li></ul></ul><ul><li>Der Aufbau ist nicht unproblematisch: </li></ul><ul><ul><li>Mitunter sind viele kleine setXXX() -Aufrufe nötig. </li></ul></ul><ul><ul><li>Es kann nicht ausgeschlossen werden, dass ein Setter fehlt. </li></ul></ul><ul><ul><li>Es kann illegale Zwischenzustände ähnlich einer Transaktion geben. </li></ul></ul><ul><ul><li>Das immutable-Pattern ist mit Beans nicht zu realisieren. </li></ul></ul><ul><ul><li>Viele Design-Pattern wie Proxy oder Dekorator, die einen anderen ummanteln, sind unschön: Sie verunreinigen die Schnittstelle durch eine Funktion ähnlich setDelegate() . </li></ul></ul>
    58. 58. Der Begriff „Model-Objekt“ <ul><li>Unter einem Model-Objekt (MO) versteht man ein relativ dummes Objekt, welches </li></ul><ul><ul><li>lediglich Zustände speichert (daten-zentrierte Klasse) </li></ul></ul><ul><ul><li>aber keine Geschäftslogik anbietet. </li></ul></ul><ul><li>Einige weitere Eigenschaften: </li></ul><ul><ul><li>Kommen in nahezu jeder Applikation vor </li></ul></ul><ul><ul><li>Im Allgemeinen öffentlich </li></ul></ul><ul><ul><li>Bilden oft die Zustände 1:1 auf Relationen ab </li></ul></ul><ul><ul><li>Können leicht über JUnit getestet werden </li></ul></ul><ul><ul><li>Lassen sich leicht als Model eines MVC-Trios verwenden </li></ul></ul>
    59. 59. „Große“ Konstruktoren <ul><li>Handelt es sich nicht um ein immutable-Objekt, kann es durch mehrere setXXX() -Methoden initialisiert werden. </li></ul><ul><li>Sollen Zustände während des Konstruktionsprozesses gesetzt werden, muss ein Konstruktor die Werte annehmen. Problematisch sind: </li></ul><ul><ul><li>Die Anzahl der Parameter kann groß sein. </li></ul></ul><ul><ul><li>Eine unterschiedliche Anzahl von Argumenten kann möglich sein. </li></ul></ul><ul><ul><li>Doch bei diesem Ansatz sind viele Konstruktoren nötig. </li></ul></ul><ul><li>Ein noch übersichtliches Beispiel JButton : </li></ul><ul><ul><li>JButton(), JButton(Action a) </li></ul></ul><ul><ul><li>JButton(Icon icon) , JButton(String text) </li></ul></ul><ul><ul><li>JButton(String text , Icon icon) </li></ul></ul>
    60. 60. Argumenten-Sammler <ul><li>Abhilfe schaffen kann hier der Argumenten-Sammler: </li></ul><ul><ul><li>Modifikationsfunktionen, die an setXXX() -Methoden erinnern, liefern die this -Referenz zurück, so dass sie hintereinander gesetzt werden können. </li></ul></ul><ul><li>Für einen JButton könnte der Standard-Konstruktor reichen, sowie so genannte Akkumulator-Methoden </li></ul><ul><ul><li>JButton action(Action a) </li></ul></ul><ul><ul><li>JButton icon(Icon icon) , JButton icon(String text) , </li></ul></ul><ul><li>Die Funktionen beginnen bewusst nicht mit get -, da sie von der Signatur keine Setter sind (Setter sind void ). </li></ul><ul><li>Vergleiche StringBuffer und append() : </li></ul><ul><ul><li>Der Unterschied zum Argumenten-Sammler ist aber, dass beim StringBuffer die Reihenfolge relevant ist. </li></ul></ul>
    61. 61. Professionelle IT-Qualifizierung
    62. 62. tutego über tutego <ul><li>Inhouse-Schulungen mit individualisierten Inhalten und Terminauswahl </li></ul><ul><li>190 Seminare </li></ul><ul><li>Kernkompetenz Java (60 Themen) </li></ul><ul><li>Europaweit führende Position im Bereich Java-Schulungen </li></ul><ul><li>Hochqualifizierte und zertifizierte Referenten </li></ul><ul><li>Firmengründung 1997 durch Java Champion Christian Ullenboom </li></ul>
    63. 63. Unsere Themen
    64. 64. Unsere Themen

    ×