5. Objektorientierte Implementierung mit Java-Datenstrukturen 5.1 5.2 5.3 Java-2 Collection Framework Generisches Programmieren Auswahl von Datenstrukturen Technische Universität Dresden Prof. Hußmann Softwaretechnologie 5. Objektorientierte Implementierung 5.1 Java-2 Collection Framework Technische Universität Dresden Prof. Hußmann Seite 1 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 Technische Universität Dresden Prof. Hußmann 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} Überladene Namen! * Bestellposition – anzahl: String – preis: int für 1 + einzelpreis(): int * + einzelpreis(p: int) + positionspreis(): int Technische Universität Dresden Artikel – name: String – preis: int + preis(): int Prof. Hußmann Seite 2 Softwaretechnologie Testprogramm für Anwendungsbeispiel (1) 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(); ...} Online: Bestellung0.java Technische Universität Dresden Bestellung("TUD"); Bestellposition(tisch,1)); Bestellposition(stuhl,4)); Bestellposition(schrank,2)); Bestellung Bestellung fuer fuer Kunde Kunde TUD TUD 0. 1 x Tisch Einzelpreis: 0. 1 x Tisch Einzelpreis: 200 200 Summe: Summe: 200 200 1. 1. 44 xx Stuhl Stuhl Einzelpreis: Einzelpreis: 100 100 Summe: Summe: 400 400 2. 2. 22 xx Schrank Schrank Einzelpreis: Einzelpreis: 300 300 Summe: Summe: 600 600 Auftragssumme: Auftragssumme: 1200 1200 Prof. Hußmann Softwaretechnologie Testprogramm für Anwendungsbeispiel (2) public static void main (String[] args) { ... b1.sonderpreis(1,50); b1.print(); } Bestellung Bestellung fuer fuer Kunde Kunde TUD TUD 0. 1 x Tisch Einzelpreis: 0. 1 x Tisch Einzelpreis: 200 200 Summe: Summe: 200 200 1. 4 x Stuhl Einzelpreis: 50 Summe: 1. 4 x Stuhl Einzelpreis: 50 Summe: 200 200 2. 2. 22 xx Schrank Schrank Einzelpreis: Einzelpreis: 300 300 Summe: Summe: 600 600 Auftragssumme: 1000 Auftragssumme: 1000 Technische 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) { liste[anzahl] = b; anzahl++; // was passiert bei mehr als 20 Positionen ? } public void loeschePosition (int pos) { // geht mit Arrays nicht einfach zu realisieren ! } Technische 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 Technische Universität Dresden Prof. Hußmann Seite 4 Softwaretechnologie Java-2 Collection Framework • Objektorientierte Datenstrukturbibliothek für Java – viele 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 Technische Universität Dresden Prof. Hußmann Softwaretechnologie Java Collection Framework: Struktur <<interface>> Collection <<interface>> List <<interface>> Set <<interface>> SortedSet Technische Universität Dresden Prof. Hußmann Seite 5 <<interface>> Map <<interface>> SortedMap 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 + Sortierung • 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 + Sortierung danach Technische Universität Dresden Prof. Hußmann Softwaretechnologie java.util.Collection (Auszug) public interface Collection { public public public public public public ... boolean add (Object o); boolean remove (Object o); void clear(); boolean isEmpty(); boolean contains (Object o); int size(); } Technische Universität Dresden Prof. Hußmann Seite 6 Softwaretechnologie java.util.List (Auszug) public interface List extends Collection { 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(); Object get (int index); Object set (int index, Object element); Object remove (int index); int indexOf (Object o); } Technische Universität Dresden Prof. Hußmann Softwaretechnologie Object - Collection - List : Beispiel o : Object Keine speziellen Operationen anwendbar "implements" o : XCol XCol Collection add, remove, clear, isEmpty, contains, size "implements" o : XList XList List add, remove, clear, isEmpty, contains, size, get, set, remove, indexOf Technische Universität Dresden Prof. Hußmann Seite 7 Softwaretechnologie Die Klasse "Object" (Wiederholung) • 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() Technische Universität Dresden Prof. Hußmann Softwaretechnologie Abstrakter und konkreter Datentyp Abstrakter Datentyp (Schnittstelle) Abstraktion: Konkreter Datentyp (Implementierung) Konkretisierung: – Operationen – Verhalten der Operationen • Theorie: • Theorie: – Algebraische Spezifikationen » Axiomensysteme • Praxis: – Datenstrukturen – Komplexität • Praxis: – Abstrakte Klassen – Interfaces – Alternativen • Beispiel: • Beispiel: – List Technische Universität Dresden – Instantiierbare Klassen – Ausführbare Operationen – Verkettete Liste – Liste durch Feld Prof. Hußmann Seite 8 Softwaretechnologie Implementierungen im Collection-Framework <<interface>> Vererbung (extends) Collection <<interface>> List Implementierung (implements) <<interface>> Set <<interface>> SortedSet ArrayList LinkedList Technische Universität Dresden HashSet <<interface>> Map <<interface>> SortedMap HashMap TreeSet TreeMap Prof. Hußmann 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 Object remove (int index); public int indexOf (Object o); public ArrayList (int initialCapacity); public void ensureCapacity (int minCapacity); ... } Technische Universität Dresden Prof. Hußmann Seite 9 Softwaretechnologie 5. Objektorientierte Implementierung 5.2 Generisches Programmieren "Der "DerAufrufer Aufruferprogrammiert programmiertgegen gegendie dieSchnittstelle, Schnittstelle, er erbefindet befindetsich sichsozusagen sozusagenim imluftleeren luftleerenRaum." Raum." Siedersleben/Denert, Siedersleben/Denert, Wie Wiebaut bautman manInformationssysteme, Informationssysteme, Informatik-Spektrum Informatik-Spektrum, ,August August2000 2000 Technische Universität Dresden Prof. Hußmann 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; this.liste = new ArrayList(); } public void neuePosition (Bestellposition b) { liste.add(b); } public void loeschePosition (int pos) { liste.remove(pos); } ... Technische Universität Dresden Prof. Hußmann Seite 10 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); ArrayList Object definiert auf Bestellposition Spezialisierung von Object auf Bestellposition? Technische Universität Dresden Prof. Hußmann Generisches Programmieren Bestellung – kunde: String – anzahl: int 1 Softwaretechnologie * Object java.util.ArrayList add(Object o) liste get(pos: int): Object ... Zusicherung: Zusicherung:Alle Allevon voneinem einemBestellung-Objekt Bestellung-Objekt über die liste-Assoziation über die liste-Assoziationerreichbaren erreichbarenObjekte Objekte sind sindaus ausder derKlasse KlasseBestellposition. Bestellposition. * Bestellposition Typanpassung Typanpassung(cast): (cast): •• Operationen Operationender derOberklasse Oberklassepassen passenimmer immer auch auchauf aufObjekte Objekteder derUnterklasse Unterklasse •• Operationen Operationender derUnterklasse Unterklasseauf aufObjekte Objekteeiner einerOberklasse Oberklasse anzuwenden, anzuwenden,erfordert erfordertexplizite expliziteTypanpassung Typanpassung(dynamic (dynamiccast): cast): ((Typ Typ ))Objekt Objekt hier: hier: (Bestellposition)liste.get(pos) (Bestellposition)liste.get(pos) Technische Universität Dresden Prof. Hußmann Seite 11 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(); } } Online: Bestellung1.java Technische Universität Dresden Prof. Hußmann Softwaretechnologie Iterator-Konzept • Aufzählen der in einem “Behälter” befindlichen Elemente – Keine Aussage über die Reihenfolge! – Interface java.util.Iterator interface Iterator { public boolean hasNext(); public 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(); Technische Universität Dresden Prof. Hußmann Seite 12 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; } ... } Online: Bestellung2.java Technische Universität Dresden Prof. Hußmann 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 Object remove (int index); public int indexOf (Object o); public void addFirst (Object o); public void addLast (Object o); ... Anwendungsbeispiel Online: } mit LinkedList: Technische Universität Dresden Prof. Hußmann Seite 13 Bestellung3.java Softwaretechnologie Generisches Programmieren ! List ist ein Interface, keine Klasse ! class Bestellung { private String kunde; private List liste; ... // Konstruktor sh. nächste Folien public void neuePosition (Bestellposition b) { liste.add(b); } public void loeschePosition (int pos) { liste.remove(pos); } public void sonderpreis (int pos, int preis) { ((Bestellposition)liste.get(pos)).einzelpreis(preis); } Technische Universität Dresden Prof. Hußmann Wechsel der Datenstruktur • ArrayList: class Bestellung { private String kunde; private List liste; public Bestellung(String kunde) { this.kunde = kunde; this.liste = new ArrayList(); } ... Softwaretechnologie ! List ist ein Interface, keine Klasse ! • LinkedList: class Bestellung { private String kunde; private List liste; public Bestellung(String kunde) { this.kunde = kunde; this.liste = new LinkedList(); } ... Technische Universität Dresden Prof. Hußmann Seite 14 Code muß bei Wechsel der Datenstruktur nur an einer Stelle (Konstruktor) geändert werden ! 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(...) Technische 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: genau dann wenn "this" kleiner/gleich/größer als Objekt o Standarddatentypen (z.B. String) implementieren Comparable Technische Universität Dresden Prof. Hußmann Seite 15 Softwaretechnologie