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