Vom objektorientierten Entwurf zur Implementierung in Java 2. Dezember 2014 Überblick Verwendung von Frameworks und Bibliotheken Was enthält die Java Standard Edition? Implementieren mit dem Java Collections Framework zum Arbeiten mit Objektmengen, –listen und Abbildungen Dokumentation: Java Standard Edition 8: http://docs.oracle.com/javase/8/docs/ Wie wird ein Entwurfsmodell in Code übersetzt? Ein- und Ausgabe in Dateien Taentzer Einführung in die Softwaretechnik 226 Implementierungsprinzipien Verwendung von Klassenbibliotheken, wo möglich Wiederverwendung des Codes soweit möglich Realisierung des Entwurfs, bei Abweichungen den Entwurf entsprechend anpassen auf die Testbarkeit von Methoden achten kleine Einheiten realisieren und testen weitgehend selbstdokumentierender Code Verwendung von javadoc zur Dokumentation von Klassen und komplexeren Methoden Taentzer Einführung in die Softwaretechnik 227 Beispiel: Entwurfsmodell Taentzer Einführung in die Softwaretechnik 228 Java Standard Edition Zu Java gibt es eine große Standardklassenbibliothek. Unter anderem enthalten: java.awt, java.swing: Graphiken und Bilder, graphische Benutzeroberflächen java.lang: grundlegende Klassen für die Sprache Java java.io: Ein- und Ausgabe in Datenströme, Dateien, etc. java.math: mathematische Funktionen java.net: Implementierung von Netzwerk-Anwendungen java.sql: Datenquellen, insbesondere relationale Datenbanken java.util: nützliche Helfer, insbesondere Java Collections Framework, Ereignismodell, Date und Time-Funktionalitäten Taentzer Einführung in die Softwaretechnik 229 Java Standard Edition 8: Überblick aus „http://docs.oracle.com/javase/8/docs/“ Taentzer Einführung in die Softwaretechnik 230 Das Java Collections Framework Das Java Collections Framework (JCF) bietet Implementierungen der gängigsten Datenstrukturen. zu finden im Paket java.util Z.B. lassen sich die Assoziationen durch JCF-Datenstrukturen implementieren. Collection für Objektbehälter Map für Zuordnungen von Schlüsseln zu Werten Schlüssel sind eindeutig. Taentzer Einführung in die Softwaretechnik 231 Java Collections Klassen (1) aus „http://wiki3.cosc.canterbury.ac.nz“ Taentzer Einführung in die Softwaretechnik 232 Collection Schnittstellenklassen Collection: Ein Behälter für Objekte. Die im folgenden aufgeführten Schnittstellen Set, SortedSet und List sind von Collection abgeleitet. Set: Ein Behälter für Objekte mit Mengencharakter. Duplikate sind nicht erlaubt. SortedSet: Analog zu Set mit dem Unterschied, dass die Elemente sortiert werden. List: Ein Objektbehälter, in dem Objekte über Integer-Werte indiziert werden. Duplikate sind erlaubt. Ein neues Element kann an eine beliebige Stelle in einer List positioniert werden. Queue: Ein Objektbehälter, in den immer vorn oder immer hinten eingefügt und vorn herausgenommen wird (LIFO (Stack) und FIFO (Queue)). Taentzer Einführung in die Softwaretechnik 233 Die Collection-Schnittstelle Typ: Collection<E> - iterierbare Ansammlung von Objekten vom Typ E boolean add(E e) – fügt Element e hinzu boolean contains(E e) – prüft, ob Element e enthalten ist boolean remove(E e) – entfernt Element e Iterator<E> iterator() – gibt einen Iterator auf die Collection zurück Taentzer Einführung in die Softwaretechnik 234 Welche Implementierungsklassen gibt es? aus “docs.oracle.com/javase/tutorial/collections/implementations” Taentzer Einführung in die Softwaretechnik 235 Implementierungsstrukturen Array…: intern ein größenveränderliches Array size, get(i), set(i) in konstanter Zeit, alle anderen Operationen in linearer Zeit Hash…: intern eine Hashing und Mapping-Struktur Die Schlüssel (Keys) haben i.a. keine Bedeutung (ungeordnet). effiziente und ca. gleiche Zeit zum Auffinden von Elementen Linked…: Elemente intern verlinkt optimal für das Einfügen/Löschen von Elementen und zum Iterieren durch alle Elemente Tree…: interne Speicherung durch einen Baum Reihenfolge der Elemente durch natürliche Ordnung oder einen speziellen Vergleichsoperator Taentzer Einführung in die Softwaretechnik 236 Durch eine Collection iterieren Java 1.4 oder älter: Collection c = new HashSet(); c.add(“a“); c.add(“b“); Iterator i = c.iterator(); while(i.hasNext()) System.out.println((String)i.next()); ab Java 5: Collection<String> c = new HashSet<String>(); c.add(“a“); c.add(“b“); for(String i:c) System.out.println(i); Taentzer Einführung in die Softwaretechnik 237 Beispielcode für eine sortierte Menge Schnittstelle: SortedSet Implementierung: TreeSet Die zu sortierenden Elemente müssen Comparable implementieren. Ausgabe: Taentzer Einführung in die Softwaretechnik 238 Die Schnittstelle Comparable zu überschreibende Methode: Beispiel: compareTo() Parameter: das zu vergleichende Objekt o Rückgabe: negativ: this kleiner o 0: this gleich o positiv: this größer o bzgl. der definierten Ordnung wirft Exceptions: NullPointerException ClassCastException Taentzer Einführung in die Softwaretechnik 239 Natürliche Ordnungen für verschiedene Klassen aus “docs.oracle.com/javase/tutorial/collections/interfaces” Taentzer Einführung in die Softwaretechnik 240 Gleichzeitiges Iterieren und Ändern von Collections Code-Ausschnitt: Set<String> s = new HashSet<String>(); s.add(“a“); s.add(“b“); for(String i: s){ System.out.println(i); s.add(“x“); } führt zu einer Concurrent Modification Exception Deshalb: Iterieren und Änderungen separat halten (eventuell in einer HilfsCollection). Also erst ändern, dann iterieren. Oder erst iterieren, dann ändern. Absicherung: Set<String> c = Collection.synchronized(new HashSet<String>()); Taentzer Einführung in die Softwaretechnik 241 Tuning der Implementierung ArrayList: initialCapacity: Anzahl der Elemente in der ArrayList, bevor sie erweitert werden muss Listen von fester Länge: Arrays.asList() HashSet: initialCapacity: Anzahl der Hash-Behälter (engl. Buckets), initial: 16 Richtwert: 2 x die erwartete Größe load factor: Auslastung der Behälter (wird meist nicht geändert) Taentzer Einführung in die Softwaretechnik 242 Java Collections Klassen (1) aus „http://wiki3.cosc.canterbury.ac.nz“ Taentzer Einführung in die Softwaretechnik 243 Map-Schnittstellenklassen Map Map definiert eine Zuordnung von Schlüsseln zu Werten. Jedem Schlüssel wird eindeutig ein Wert zugewiesen. Schlüssel können somit keine Duplikate enthalten, Werte schon. SortedMap Map, deren Schlüssel zusätzlich sortiert werden. HashMap HashCode als Schlüssel Taentzer Einführung in die Softwaretechnik 244 Map-Schnittstelle Map<K,V> - Zuordnung von Objekten der Klasse V zu Schlüsseln der Klasse K V put(K key, V value) – Zuordnung von Wert value zu Schlüssel key boolean containsKey(K key) – prüft, ob der Schlüssel key definiert ist V get(K key) – gibt den Wert für Schlüssel key zurück Set<K> keySet() – gibt die Schlüsselmenge zurück Collection<V> values() – gibt die Wertansammlung zurück Map<Integer,String> m = new HashMap<Integer,String>(); m.put(1,"c"); m.put(2,"d"); Collection<String> strings = m.values(); for (String s: strings) System.out.println(s); Taentzer Einführung in die Softwaretechnik 245 Beispiel: Häufigkeit der bestellten Produkte Taentzer Einführung in die Softwaretechnik 246 Auswahl der richtigen Collection bzw. Map Taentzer Einführung in die Softwaretechnik 247 Überblick Verwendung von Frameworks und Bibliotheken Was enthält die Java Standard Edition? Implementieren mit dem Java Collections Framework zum Arbeiten mit Objektmengen, –listen und Abbildungen Dokumentation: Java Standard Edition 8: http://docs.oracle.com/javase/7/docs/ Wie wird ein Entwurfsmodell in Code übersetzt? Ein- und Ausgabe in Dateien Taentzer Einführung in die Softwaretechnik 248 Entwurfsmodell: Update Taentzer Einführung in die Softwaretechnik 249 Java-Projekt: 1. Iteration Realisierung der Datenschicht mit Datenhaltung in Dateien Datenschicht in Paket data UML-Klassen Java-Klassen UML-Enumeration Java-Enum UML-Attribute Java-Felder binäre UML-Assoziationen ein oder zwei Java-Felder UML-Operation Java-Methode UML-Vererbung Java-Vererbung Paket test für Test-Klassen Ordner files für Test-Dateien Taentzer Einführung in die Softwaretechnik 250 Singleton-Klassen Es soll genau ein Objekt der Klasse geben. Lösung: Instanz als Klassenvariable Privater Konstruktor Getter für die Instanz Beispiele: Factory: Eine Klasse, die Objekte eines Pakets erzeugt. Einstiegsklasse für ein Paket Registry: zentrale Klasse, die Informationen vermittelt Taentzer public class Singleton { private static Singleton instance = null; private Singleton() {} public static getInstance() { if (instance == null){ instance = new Singleton(); } return instance; } Einführung in die Softwaretechnik 251 Singleton-Klassen Beispiel: Besser als globale Variable: wird nur erzeugt, wenn benötigt kann spezialisiert werden kann leichter zu mehreren Objekten geändert werden Taentzer Wartekartei.java: Einführung in die Softwaretechnik 252 Realisierung von Methoden Beispiel: Wareneingang bearbeiten längere Algorithmen in funktionale Einheiten zerlegen Welche beteiligten Objekte übernehmen welche Einheiten? neue (private) Methoden identifizieren Entwurfsmodell bzgl. neuer öffentlicher Methoden anpassen Taentzer Einführung in die Softwaretechnik 253 Realisierung von Methoden Beispiel: Wareneingang bearbeiten Produkt.java: Wartekartei.java: Taentzer Einführung in die Softwaretechnik 254 Ausgabe in eine Datei Bibliothek java.io benutzen Datei zum Schreiben öffnen z.B: FileWriter zum Schreiben von Text Output-Stream erzeugen z:B: java.io.BufferedWriter und in die angegebene write() zum Schreiben eines Datei lenken IOException abfangen Strom zum Schluss schließen Taentzer Buchstabens oder eines Strings newLine() zum Schrieben eines Zeilenseparators close() zum Schließen des Stroms Einführung in die Softwaretechnik 255 Ausgabe in eine Datei: Beispiel in Java-Code Kartei.java: Taentzer Einführung in die Softwaretechnik 256 Einlesen aus einer Datei Bibliotheken java.io und java.util benutzen Datei zum Lesen öffnen Input-Stream erzeugen und mit der Datei verknüpfen IOException abfangen Strom zum Schluss schließen strukturiertes Einlesen mit StreamTokenizer oder Scanner strukturiert die Eingabe in sinnvolle Einheiten Taentzer z.B. FileReader zum Lesen von Text z.B. BufferedReader read(), readLine(), close() – analog zu BufferedWriter z.B. Scanner hasNext() – hat noch Eingabe nextInt() – nächster Integer next() – nächster String nextLine() – nächste Zeile Einführung in die Softwaretechnik 257 Beispiel: Einlesen aus einer Datei: Kartei.java: Taentzer Einführung in die Softwaretechnik 258 Zusammenfassung Java Collections Framework Verwendung von Standardstrukturen und –algorithmen bzgl. Objektmengen, –listen und Abbildungen Sortieren entlang einer natürlichen Ordnung, implementiert durch Comparable Verschiedene Implementierungen, je nach Anforderungen: mehr Iterieren oder mehr Hinzufügen und Löschen Nur eine Aktion zu einer Zeit: Nicht gleichzeitig durch eine Collection iterieren und sie ändern. Möglichst direkte Übersetzung des Entwurfsmodells in Code Ein- und Ausgabe in Dateien für die Eingabe Scanner benutzen Taentzer Einführung in die Softwaretechnik 259