5. Objektorientierte Implementierung mit Java-Datenstrukturen 5.1 5.2 5.3 5.4 Java-2 Collection Framework Generisches Programmieren Auswahl von Datenstrukturen Ausnahmebehandlung in Java T echnische Universität Dresden Prof. Hußmann Softwaretechnologie 5. Objektorientierte Implementierung 5.3 Auswahl von Datenstrukturen T echnische Universität Dresden Prof. Hußmann Seite 1 Softwaretechnologie "Alte" Datenstrukturen (aus Java 1.0) <<interface>> Vererbung (extends) Collection Implementierung (implements) <<interface>> <<interface>> <<interface>> List Set Map <<interface>> <<interface>> SortedSet SortedMap ArrayList HashSet LinkedList Vector TreeSet T echnische Universität Dresden Prof. Hußmann HashMap Hashtable TreeMap Softwaretechnologie Welche Listen-Implementierung? • Gemessener relativer Aufwand für Operationen auf Listen: (aus Eckel, Thinking in Java, 2nd ed., 2000) Typ array ArrayList LinkedList Vector Lesen 1430 3070 16320 4890 Iteration 3850 12200 9110 16250 Einfügen -500 110 550 Entfernen -46850 60 46850 • Stärken von ArrayList: – wahlfreier Zugriff • Stärken von LinkedList: – Iteration – Einfügen und Entfernen irgendwo in der Liste • Vector generell die langsamste Lösung T echnische Universität Dresden Prof. Hußmann Seite 2 Softwaretechnologie java.util.Set (Auszug) public interface Set { public public public public public public ... public public ... public boolean add (Object o); boolean remove (Object o); void clear(); boolean isEmpty(); boolean contains (Object o); int size(); boolean equals (Object o); int hashCode(); Iterator iterator(); } T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Anwendungsbeispiel für Set Warengruppe – name: String – lagerplatz: String + add (a: Artikel) + anzahl(): int 1 * Artikel – name: String – preis: int + preis(): int T echnische Universität Dresden Prof. Hußmann Seite 3 Softwaretechnologie java.util.HashSet (Auszug) public class HashSet implements Set ... { public HashSet (int initialCapacity, float loadFactor); ... public boolean add (Object o); public boolean remove (Object o); public void clear(); public boolean isEmpty(); public boolean contains (Object o); public int size(); public boolean equals (Object o); public int hashCode(); ... public Iterator iterator(); } (Anmerkung: Erläuterung von Hashfunktionen folgt etwas später !) T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Anwendungsbeispiel mit HashSet class Warengruppe { private String name; private String lagerplatz; private Set inhalt; public Warengruppe (String name, String lagerplatz) { this.name = name; this.lagerplatz = lagerplatz; this.inhalt = new HashSet(); } public void add (Artikel a) { inhalt.add(a); } public int anzahl() { return inhalt.size(); } public String toString() { String s = "Warengruppe "+name+"\n"; Iterator it = inhalt.iterator(); while (it.hasNext()) { s += " "+(Artikel)it.next(); }; } } T echnische Universität Dresden Prof. Hußmann Seite 4 Softwaretechnologie Wann sind Objekte gleich? (1) • Vergleich mit Operation == : – Referenzgleichheit, d.h. physische Identität der Objekte – Typischer Fehler: Stringvergleich mit "==" • Vergleich mit o.equals(): – deklariert in java.lang.Object – überdefiniert in vielen Bibliotheksklassen » z.B. java.lang.String – für selbstdefinierte Klassen » Standardbedeutung Referenzgleichheit » bei Bedarf selbst überdefinieren ! • Bei Verwendung von Hashfunktionen (z.B. durch HashSet): – Operation o.hashCode() aus java.lang.Object überdefinieren T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Wann sind Objekte gleich? (2) public static void main (String[] args) { Warengruppe w1 = new Warengruppe("Moebel","L1"); w1.add(new Artikel("Tisch",200)); w1.add(new Artikel("Stuhl",100)); w1.add(new Artikel("Schrank",300)); w1.add(new Artikel("Tisch",200)); System.out.println(w1); } Systemausgabe: Warengruppe Moebel Tisch(200) Tisch(200) Schrank(300) Stuhl(100) T echnische Universität Dresden Prof. Hußmann Seite 5 Softwaretechnologie Wann sind Objekte gleich? (3) public static void main (String[] args) { Artikel tisch = new Artikel("Tisch",200); Artikel stuhl = new Artikel("Stuhl",100); Artikel schrank = new Artikel("Schrank",300); Warengruppe w2 = new Warengruppe("Moebel","L2"); w2.add(tisch); w2.add(stuhl); w2.add(schrank); w2.add(tisch); System.out.println(w1); } Systemausgabe: Warengruppe Moebel Schrank(300) Tisch(200) Stuhl(100) T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Delegation vs. Vererbung class Warengruppe { … Delegation private Set inhalt; public Warengruppe (…) { … this.inhalt = new HashSet(); } public void add (Artikel a) { inhalt.add(a); } … } class Warengruppe extends HashSet { … Vererbung public Warengruppe (…) { super(); … } … // keine explizite add-Operation ! } T echnische Universität Dresden Prof. Hußmann Seite 6 Softwaretechnologie java.util.SortedSet (Auszug) public interface SortedSet extends Set { public public public public public public ... public public public ... public public boolean add (Object o); boolean remove (Object o); void clear(); boolean isEmpty(); boolean contains (Object o); int size(); boolean equals (Object o); int hashCode(); Iterator iterator(); Object first(); Object last(); ... } T echnische Universität Dresden Prof. Hußmann Softwaretechnologie java.util.TreeSet • Modifikation der Klasse Warengruppe: class Warengruppe { private Set inhalt; public Warengruppe (…) { … this.inhalt = new TreeSet(); } … } • Systemreaktion: Exception in thread "main" java.lang.ClassCastException: Artikel at java.util.TreeMap.compare(TreeMap.java, Compiled Code) • java.util.TreeSet: public class TreeSet … implements SortedSet … { … } T echnische Universität Dresden Prof. Hußmann Seite 7 Softwaretechnologie Anwendungsbeispiel mit TreeSet • Modifikation der Klasse „Artikel“: class Artikel implements Comparable { ... public int compareTo (Object o) { return name.compareTo(((Artikel)o).name); } } • Systemausgabe: Warengruppe Moebel Schrank(300) Stuhl(100) Tisch(200) T echnische Universität Dresden Prof. Hußmann Softwaretechnologie HashSet oder TreeSet? • Gemessener relativer Aufwand für Operationen auf Mengen: (aus Eckel, Thinking in Java, 2nd ed., 2000) Typ HashSet TreeSet Einfügen 36,14 150,6 Enthalten 106,5 177,4 Iteration 39,39 40,04 • Stärken von HashSet: – in allen Fällen schneller ! • Stärken von TreeSet: – erlaubt Operationen für sortierte Mengen T echnische Universität Dresden Prof. Hußmann Seite 8 Softwaretechnologie java.util.Map (Auszug) public interface Map { ... public boolean containsKey (Object key); public boolean containsValue (Object value); public Object get (Object key); public Object put (Object key, Object value); public Object remove (Object key); public int size(); public Set keySet(); public Collection values(); ... } „Assoziativer Speicher“ T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Anwendungsbeispiel Katalog – name: String + put (code: String, a: Artikel) + get (code: String): Artikel + anzahl(): int code: String * 1 Artikel – name: String – preis: int + preis(): int T echnische Universität Dresden Prof. Hußmann Seite 9 Softwaretechnologie Anwendungsbeispiel mit HashMap class Katalog { private String name; private Map inhalt; public Katalog (String name) { this.name = name; this.inhalt = new HashMap(); } public void put (String code, Artikel a) { inhalt.put(code,a); } public int anzahl() { return inhalt.size(); } public Artikel get (String code) { return (Artikel)inhalt.get(code); } ... } T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Testprogramm für Anwendungsbeispiel public static void main (String[] args) { Artikel Artikel Artikel Artikel tisch = stuhl = schrank regal = new Artikel("Tisch",200); new Artikel("Stuhl",100); = new Artikel("Schrank",300); new Artikel("Regal",200); Katalog k = new Katalog("Katalog1"); k.put("M01",tisch); k.put("M02",stuhl); k.put("M03",schrank); System.out.println(k); k.put("M03",regal); System.out.println(k); } • T echnische Universität Dresden Prof. Hußmann Seite 10 Softwaretechnologie Systemausgabe für Testprogramm Katalog Katalog1 M03 -> Schrank(300) M02 -> Stuhl(100) M01 -> Tisch(200) Katalog Katalog1 M03 -> Regal(200) M02 -> Stuhl(100) M01 -> Tisch(200) put(...) überschreibt vorhandenen Eintrag (liefert vorhandenen Eintrag als Ergebnis). Eine Ordnung auf den Schlüsseln wird erst durch SortedMap (Implementierung z.B.TreeMap) erreicht. T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Prinzip der Hashtabelle hashtab 0 Object hashCode(): int key: Object key.hashCode() value: Object value: Object Effekt von hashtab.put(key,value) capacity T echnische Universität Dresden Prof. Hußmann Seite 11 Softwaretechnologie Kollision 0 key1: Object value1: Object key2: Object key1.hashCode() = key2.hashCode() value?: Object value2: Object capacity T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Vorgehensweise beim Datenstruktur-Entwurf Identifikation der Anforderungen an die Datenstruktur: Funktionalität, häufig benutzte Operationen Abstraktion auf die wesentlichen Eigenschaften Suche nach vorgefertigten Lösungen Ggf. Experimente (experimentelle Prototypen) Anpassung an vorgefertigte Lösung T echnische Universität Dresden Entwicklung einer neuartigen Lösung Prof. Hußmann Seite 12 Softwaretechnologie Realisierung von Assoziationen mit Set assoc A * B class A { private Set assoc; ... public void addAssoc (B b) { assoc.add(b); } public boolean testAssoc (B b) { return assoc.contains(b); } public A { ... assoc = new HashSet(); } T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Beispiel zu Set-Assoziationen (Teil 1) Teambesprechung * * teilnahme Teammitglied name abteilung import import java.util.Set; java.util.Set; import import java.util.HashSet; java.util.HashSet; import import java.util.Iterator; java.util.Iterator; ... ... class class Teammitglied Teammitglied {{ private private String String name; name; private private String String abteilung; abteilung; private private Set Set teilnahme; teilnahme; public void public void teilnahmeSetzen teilnahmeSetzen (Teambesprechung (Teambesprechung b) b) {{ teilnahme.add(b); teilnahme.add(b); }} public public Teammitglied Teammitglied (String (String name, name, String String abteilung) abteilung) {{ this.name this.name == name; name; this.abteilung this.abteilung == abteilung; abteilung; this.teilnahme this.teilnahme == new new HashSet(); HashSet(); }} ... ... }} T echnische Universität Dresden Prof. Hußmann Seite 13 Softwaretechnologie Beispiel zu Set-Assoziationen (Teil 2) class Teammitglied { ... public boolean terminBestaetigen (Date beginn,int dauer) { boolean konflikt = false; Iterator it = teilnahme.iterator(); while (it.hasNext() && !konflikt) { Teambesprechung b = (Teambesprechung)it.next(); if (b.inKonflikt(beginn, dauer)) konflikt = true; }; return !konflikt; } ... } T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Suche nach vorgefertigten Lösungen Collection Map Einfügen eines Elements Entfernen eines Elements Aufzählen aller Elemente "ist enthalten"-Abfrage dynamisch erweiterbar Einfügereihenfolge relevant? ja Sortierung der Schlüssel relevant? SortedMap nein List Abfrage an i-ter Position Ersetzen an i-ter Position Entfernen an i-ter Position T echnische Universität Dresden Einfügen eines Werts für einen Schlüssel Entfernen eines Schlüssel/Wert-Paars Abfrage eines Werts für einen Schlüssel "ist enthalten"-Abfrage für Schlüssel dynamisch erweiterbar Set Sortierung relevant? SortedSet kleinstes/größtes Element Elemente "über"/"unter" x Prof. Hußmann Seite 14 Softwaretechnologie Beispiel: Realisierung von Assoziationen A * B assoc Datenstruktur im A-Objekt für B-Referenzen Anforderung Abstraktion 1) Assoziation anlegen 2) Assoziation entfernen 3) Durchlaufen aller bestehenden Assoziationen zu B-Objekten 4) Manchmal: Abfrage, ob Assoziation zu einem B-Objekt besteht 5) Keine Obergrenze der Multiplizität gegeben T echnische Universität Dresden 1) Einfügen (ohne Reihenfolge) 2) Entfernen (ohne Reihenfolge) 3) Aufzählen aller Elemente 4) "ist enthalten"-Abfrage 5) Maximalanzahl der Elemente unbekannt; dynamisch erweiterbar Prof. Hußmann Softwaretechnologie Beispiel: Raumverwaltung static Besprechungsraum freienRaumSuchen (int groesse, Hour beginn, int dauer) • Suche unter vorhandenen Räumen nach Raum mit mindestens der Kapazität groesse, aber möglichst klein. – Datenstruktur für vorhandene Räume in Klasse Raumverwaltung » SortedSet (Elemente: Besprechungsraum) • Überprüfung eines Raumes, ob er für die Zeit ab beginn für die Länge dauer bereits belegt ist. – Operation in Klasse Besprechungsraum: boolean frei (Hour beginn, int dauer) – Datenstruktur in Klasse Besprechungsraum für Zeiten (Stunden): » Set (Elemente: Hour) • Zusatzanforderung (Variante): Überprüfung, welcher andere Termin eine bestimmte Stunde belegt. – Datenstruktur in Klasse Besprechungsraum: » Map (Schlüssel: Hour, Wert: Teambesprechung) T echnische Universität Dresden Prof. Hußmann Seite 15 Softwaretechnologie Raumverwaltung: Freien Raum suchen class Raumverwaltung { private static SortedSet vorhandeneRaeume = new TreeSet(); // Vorhandene Raeume, aufsteigend nach Groesse sortiert static Besprechungsraum freienRaumSuchen (int groesse, Hour beginn, int dauer) { Besprechungsraum r = null; boolean gefunden = false; Iterator it = vorhandeneRaeume.iterator(); while (! gefunden && it.hasNext()) { r = (Besprechungsraum)it.next(); if (r.grossGenug(groesse)&&r.frei(beginn,dauer)) gefunden = true; }; if (gefunden) return r; else return null; } ... } T echnische Universität Dresden Prof. Hußmann Softwaretechnologie 5. Objektorientierte Implementierung 5.4 Ausnahme-Behandlung T echnische Universität Dresden Prof. Hußmann Seite 16 Softwaretechnologie Ausnahmebehandlung in Java • Ausnahme (Exception): – Objekt einer Unterklasse von java.lang.Exception – Vordefiniert oder und selbstdefiniert • Ausnahme auslösen (to throw an exception) – Erzeugen eines Exception-Objekts – Löst Suche nach Behandlung aus • Ausnahme abfangen und behandeln (to catch and handle an exception) – Aktionen zur weiteren Fortsetzung des Programms bestimmen • Ausnahme deklarieren – Angabe, daß eine Methode außer dem normalen Ergebnis auch eine Ausnahme auslösen kann (Java: throws) – Beispiel aus java.io.InputStream: public int read() throws IOException; T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Java-Syntax für Ausnahmebehandlung class TotalDiv { public static int tDiv (int x, int y) { try { return (x / y); } catch (ArithmeticException e) { return 0; } } } T echnische Universität Dresden Prof. Hußmann Seite 17 Softwaretechnologie Suche nach Ausnahmebehandlung • Suche nach Abfangklausel (catch) entlang der (dynamischen) Aufrufhierarchie: main m1 Suchreihenfolge m2 / • Bei mehreren Abfangklauseln an der gleichen Stelle der Hierarchie gilt die zuerst definierte Klausel: try { } catch (xException e) catch (yException e) T echnische Universität Dresden Suchreihenfolge Prof. Hußmann Softwaretechnologie Definition neuer Ausnahmen class TestException extends Exception { public TestException () { super(); } } class SpecialAdd { public static int sAdd (int x, int y) throws TestException { if (y == 0) throw new TestException(); else return x + y; } } Benutzung von vordefinierten Ausnahmen möglich und empfehlenswert ! T echnische Universität Dresden Prof. Hußmann Seite 18 Softwaretechnologie Deklaration und Propagation von Ausnahmen • Wer eine Methode aufruft, die eine Ausnahme auslösen kann, muß – entweder die Ausnahme abfangen – oder die Ausnahme weitergeben (propagieren) • Propagation in Java: Deklarationspflicht mittels throws (außer bei Error und RunTimeException) public static void main (String[] argv){ System.out.println(SpecialAdd.sAdd(3,0)); } Java-Compiler: Exception TestException must be caught, or it must be declared in the throws clause of this method. T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Regeln zum Umgang mit Ausnahmen • Ausnahmebehandlung niemals zur Behandlung normaler (d.h. häufig auftretender) Programmsituationen einsetzen • Ausnahmebehandlung nicht zu komplex gestalten • Auf keinen Fall Ausnahmen “abwürgen”, z.B. durch triviale Ausnahmebehandlung • Ausnahmen zu propagieren ist keine Schande, sondern erhöht die Flexibilität des entwickelten Codes. T echnische Universität Dresden Prof. Hußmann Seite 19 Softwaretechnologie