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 OO-Design und Nicht-OO-Sprache • Elementare Konzepte der Objektorientierung lassen sich teilweise befriedigend in modularen Sprachen wiedergeben: – Verhalten: – Zustand: – Identität: Zusammenfassung von Prozeduren in Modulen Datengeheimnis von Modulen Zeigertypen • Nichtmodulare Sprachen (z.B. Original-Pascal) sind dagegen praktisch ungeeignet für OO-Entwurf. • Fortgeschrittene Konzepte der Objektorientierung lassen sich in jedem Fall nur mit Hilfskonstruktionen darstellen, insbesondere: – Vererbung, vor allem von Operationen – Polymorphie • Mögliche Strategien: – Im Entwurf Vererbung und Polymorphie entfernen – Einsatz von Werkzeugen (Präprozessoren) – OO-Erweiterung der Sprache (z.B. Object-COBOL) T echnische Universität Dresden Prof. Hußmann Seite 1 Softwaretechnologie 5. Objektorientierte Implementierung 5.1 Java-2 Collection Framework T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Bedeutung von Datenstrukturen • Struktur – Ordnungssystem für die Daten – Bereitstellung von Standard-Funktionalität • Wiederverwendung – Klassenbibliotheken – Standardalgorithmen • Anpaßbarkeit – Alternative Implementierungen für gleiche abstrakte Schnittstelle • Optimierung – Alternativen mit verschiedener Leistungscharakteristik T echnische Universität Dresden Prof. Hußmann Seite 2 Softwaretechnologie Anwendungsbeispiel für Datenstrukturen Grobes Entwurfsmodell „Bestellungsabwicklung“ (Auszug): Bestellung – kunde: String + neuePosition(b: Bestellposition) + löschePosition(pos int) +sonderpreis(pos: int, preis: int) + auftragssumme(): int + print() 1 {ordered} * Bestellposition – anzahl: String – preis: int für 1 + einzelpreis(): int * + einzelpreis(p: int) + positionspreis(): int T echnische Universität Dresden Artikel – name: String – preis: int + preis(): int Prof. Hußmann Softwaretechnologie Testprogramm für Anwendungsbeispiel public static void main (String[] args) { Artikel tisch = new Artikel("Tisch",200); Artikel stuhl = new Artikel("Stuhl",100); Artikel schrank = new Artikel("Schrank",300); Bestellung b1 = new b1.neuePosition(new b1.neuePosition(new b1.neuePosition(new b1.print(); Bestellung("TUD"); Bestellposition(tisch,1)); Bestellposition(stuhl,4)); Bestellposition(schrank,2)); b1.sonderpreis(1,50); b1.print(); } T echnische Universität Dresden Prof. Hußmann Seite 3 Softwaretechnologie Einfache Realisierung mit Arrays (1) class Bestellung { private String kunde; private Bestellposition[] liste; private int anzahl = 0; public Bestellung(String kunde) { this.kunde = kunde; liste = new Bestellposition[20]; } public void neuePosition (Bestellposition b) { // was passiert bei mehr als 20 Positionen ? liste[anzahl] = b; anzahl++; } public void loeschePosition (int pos) { // geht mit Arrays nicht einfach zu realisieren ! } T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Einfache Realisierung mit Arrays (2) public void sonderpreis (int pos, int preis) { liste[pos].einzelpreis(preis); } public int auftragssumme() { int s = 0; for(int i=0; i<anzahl; i++) s += liste[i].positionspreis(); return s; } ... } • Dynamische Arrays ? – Obergrenze erweiterbar – Automatisches Verschieben bei Löschen T echnische Universität Dresden Prof. Hußmann Seite 4 Softwaretechnologie Java-2 Collection Framework • Objektorientierte Datenstrukturbibliothek für Java – Meiste Standard-Datenstrukturen abgedeckt – Verwendung von Vererbung zur Strukturierung – Flexibel auch zur eigenen Erweiterung • „Geschichte“: – Collection Framework basiert auf Java Generic Library (JGL) der Firma ObjectSpace – Collection Framework ist erst seit Java 1.2 (Java-2) Standard » java.util.* – „Früher“, d.h. bis JDK-Version 1.1: » Java-Datenstrukturen Vector und Hashtable » JGL zusätzlich installierbar T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Java Collection Framework: Struktur <<interface>> Collection <<interface>> <<interface>> <<interface>> List Set Map T echnische Universität Dresden <<interface>> <<interface>> SortedSet SortedMap Prof. Hußmann Seite 5 Softwaretechnologie Klassifikation von Datenstrukturen • Collection (Kollektion): – Ansammlung von Datenelementen – Hinzufügen, Entfernen, Suchen, Durchlaufen • Set (Menge): – Mehrfachvorkommen spielen keine Rolle – Reihenfolge des Einfügens spielt keine Rolle – SortedSet (geordnete Menge): Ordnung auf den Elementen • List (Liste): – Mehrfachvorkommen werden separat abgelegt – Reihenfolge des Einfügens bleibt erhalten • Map (Abbildung): – Zuordnung von Schlüsselwerten auf Eintragswerte – Mehrfachvorkommen bei Schlüsseln verboten, bei Einträgen erlaubt – SortedMap (geordnete Abbildung): Ordnung auf den Schlüsseln T echnische Universität Dresden Prof. Hußmann Softwaretechnologie java.util.Collection (Auszug) public interface Collection { 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 Seite 6 Softwaretechnologie java.util.List (Auszug) public interface List extends Collection { 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 Object get (int index); public Object set (int index, Object element); public boolean remove (int index); public int indexOf (Object o); ... } T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Die Klasse "Object" • java.lang.Object: allgemeine Eigenschaften aller Objekte. – Jede Klasse ist Unterklasse von Object (“extends Object”). – Diese Vererbung ist implizit (d.h. man kann “extends Object” weglassen). – Dadurch werden Probleme mit Mehrfachvererbung vermieden. class Object { public boolean equals (Object obj); public int hashCode(); public String toString(); ... } • Jede Klasse kann die Standard-Operationen überdefinieren: – equals: Objektgleichheit (Standard: Referenzgleichheit) – hashCode: Zahlcodierung – toString: Textdarstellung, z.B. für println() T echnische Universität Dresden Prof. Hußmann Seite 7 Softwaretechnologie Standardalgorithmen: java.util.Collections public class Collections { public static Object max (Collection coll); public static Object min (Collection coll); public static int binarySearch (List list, Object key); public static void reverse (List list); public static void sort (List list) ... } • Algorithmen arbeiten mit beliebigen Klassen, die das Collectionbzw. List-Interface implementieren. • Bei manchen Operationen ist Ordnung auf Elementen vorausgesetzt. • Statische Operationen: Aufruf z.B. Collections.sort(...) T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Ordnung auf Elementen: java.lang.Comparable public interface Comparable { public int compareTo (Object o); } Resultat kleiner/gleich/größer 0: "this" kleiner/gleich/größer als Objekt o Standarddatentypen (z.B. String) implementieren Comparable T echnische Universität Dresden Prof. Hußmann Seite 8 Softwaretechnologie Abstrakter und konkreter Datentyp Abstrakter Datentyp (Schnittstelle) • Abstraktion: Konkreter Datentyp (Implementierung) • Konkretisierung: – Operationen – Verhalten der Operationen – Instantiierbare Klassen – Ausführbare Operationen • Theorie: • Theorie: – Algebraische Spezifikationen » Axiomensysteme • Praxis: – Datenstrukturen – Effizienzfragen • Praxis: – Abstrakte Klassen – Interfaces – Alternativen • Beispiel: • Beispiel: – List – Verkettete Liste – Array T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Implementierungen im Collection-Framework <<interface>> Vererbung (extends) Collection Implementierung (implements) <<interface>> <<interface>> <<interface>> List Set Map ArrayList LinkedList T echnische Universität Dresden <<interface>> <<interface>> SortedSet SortedMap HashSet TreeSet Prof. Hußmann Seite 9 HashMap TreeMap Softwaretechnologie java.util.ArrayList (Auszug) public class ArrayList implements List { public boolean add (Object o); public boolean remove (Object o); //exception! public void clear(); public boolean isEmpty(); public boolean contains (Object o); public int size(); public Object get (int index); public Object set (int index, Object element) public boolean remove (int index); public int indexOf (Object o); public ArrayList (int initialCapacity); public void ensureCapacity (int minCapacity); ... } T echnische Universität Dresden Prof. Hußmann Softwaretechnologie 5. Objektorientierte Implementierung 5.2 Generisches Programmieren "Der Aufrufer programmiert gegen die Schnittstelle, er befindet sich sozusagen im luftleeren Raum." Siedersleben/Denert, Wie baut man Informationssysteme, Informatik- Spektrum, August 2000 T echnische Universität Dresden Prof. Hußmann Seite 10 Softwaretechnologie Anwendungsbeispiel mit ArrayList (1) import java.util.ArrayList; ... class Bestellung { private String kunde; private ArrayList liste; private int anzahl = 0; public Bestellung(String kunde) { this.kunde = kunde; liste = new ArrayList(); } public void neuePosition (Bestellposition b) { liste.add(b); } public void loeschePosition (int pos) { liste.remove(pos); } ... T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Anwendungsbeispiel mit ArrayList (falsch!) ... public void sonderpreis (int pos, int preis) { liste.get(pos).einzelpreis(preis); } ... • Compilermeldung: „Method einzelpreis(int) not found in class java.lang.Object.“ liste.get(pos).einzelpreis(preis); T echnische Universität Dresden Prof. Hußmann Seite 11 Softwaretechnologie Generisches Programmieren * Bestellung – kunde: String – anzahl: int Object 1 java.util.ArrayList add(Object o) liste get(pos: int): Object ... Zusicherung: Alle von einem Bestellung-Objekt über die liste-Assoziation erreichbaren Objekte sind aus der Klasse Bestellposition. * Bestellposition Typanpassung (cast): • Operationen der Oberklasse passen immer auch auf Objekte der Unterklasse • Operationen der Unterklasse auf Objekte einer Oberklasse anzuwenden, erfordert explizite Typanpassung (dynamic cast): ( Typ ) Objekt hier: (Bestellposition)liste.get(i) T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Anwendungsbeispiel mit ArrayList (2) public void sonderpreis (int pos, int preis) { ((Bestellposition)liste.get(pos)).einzelpreis(preis); } public int auftragssumme() { int s = 0; for(int i=0; i<liste.size(); i++) s += ((Bestellposition)liste.get(i)).positionspreis(); return s; } public void print () { System.out.println("Bestellung fuer Kunde "+kunde); for(int i=0; i<liste.size(); i++) System.out.println(liste.get(i)); System.out.println("Auftragssumme: "+auftragssumme()); System.out.println(); } } T echnische Universität Dresden Prof. Hußmann Seite 12 Softwaretechnologie Iterator-Konzept • Aufzählen der in einem “Behälter” befindlichen Elemente – Keine Aussage über die Reihenfolge! – Interface java.util.Iterator interface Iterator { public abstract boolean hasNext(); public abstract Object next(); public void remove(); } Verwendungsbeispiel: Iterator i = ...; while (i.hasNext()) { doSomeThing(i.next()); } • Erzeugung eines Iterators für eine beliebige Kollektion (deklariert in java.util.Collection): public Iterator iterator(); T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Anwendungsbeispiel mit Iteratoren import java.util.Iterator; ... class Bestellung { private String kunde; private ArrayList liste; ... public int auftragssumme() { Iterator i = liste.iterator(); int s = 0; while (i.hasNext()) s += ((Bestellposition)i.next()).positionspreis(); return s; } ... } T echnische Universität Dresden Prof. Hußmann Seite 13 Softwaretechnologie java.util.LinkedList (Auszug) public class LinkedList implements List { 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 Object get (int index); public Object set (int index, Object element) public boolean remove (int index); public int indexOf (Object o); public void addFirst (Object o); public void addLast (Object o); ... } T echnische Universität Dresden Prof. Hußmann Softwaretechnologie Wechsel der Datenstruktur • ArrayList: class Bestellung { private String kunde; private List liste; public Bestellung(String kunde) { this.kunde = kunde; liste = new ArrayList(); } ... List ist ein Interface, keine Klasse ! • LinkedList: class Bestellung { private String kunde; private List liste; public Bestellung(String kunde) { this.kunde = kunde; liste = new LinkedList(); } ... T echnische Universität Dresden Prof. Hußmann Seite 14 Softwaretechnologie Selbstdefinierte Kollektionen • Eigene Implementierungen der Klassen des CollectionFrameworks, z.B.: class MyCollection extends AbstractCollection implements Collection { ...} • Standard-Gerüste für Implementierung von Kollektionsklassen: java.util.AbstractCollection, java.util.AbstractList, ... • Kollektion muß mindestens definieren: – add() – size() – iterator() T echnische Universität Dresden Prof. Hußmann Softwaretechnologie MyCollection.java (1) class MyCollection extends AbstractCollection implements Collection { private class Elem { private Object elem; private Elem next; public Elem (Object elem, Elem next) { this.elem = elem; this.next = next; } } private Elem start; private Elem end; private int size; ... T echnische Universität Dresden Prof. Hußmann Seite 15 Softwaretechnologie MyCollection.java (2) class MyCollection ... { ... public boolean add (Object o) { Elem e = new Elem(o,null); if (start == null) start = e; if (end != null) end.next = e; end = e; size++; return true; } public int size() { return size; } ... T echnische Universität Dresden Prof. Hußmann Softwaretechnologie MyCollection.java (3) class MyCollection ... { ... private class MyCollectionIterator implements Iterator { private Elem current; public MyCollectionIterator() { current = start; } public boolean hasNext() { return current != null; } public Object next() { Object o = current.elem; current = current.next; return o; } public void remove() { throw new UnsupportedOperationException(); } } public Iterator iterator() { return new MyCollectionIterator(); } } T echnische Universität Dresden Prof. Hußmann Seite 16 Softwaretechnologie