Objektorientierte Implementierung mit Java-Datenstrukturen Objektorientierte Implementierung 10 Verfeinern von Assoziationen mit dem Java-2 Collection Framework 11 Programmieren gegen Schnittstellen Auswahl von Datenstrukturen 10) Verfeinern von Assoziationen mit dem Java-2 Collection Framework Softwaretechnologie, © Prof. Uwe Aßmann, Prof. Heinrich Hussmann Persistente Datenhaltung 1 Obligatorische Literatur ► 2 Softwaretechnologie Anwendungsbeispiel für Datenstrukturen Grobes Entwurfsmodell „Bestellungsabwicklung“ (Auszug): JDK Tutorial für J2SE oder J2EE, www.java.sun.com 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 + einzelpreis(): int + einzelpreis(p: int) + positionspreis(): int für Überladene Namen! * 1 Artikel – name: String – preis: int Softwaretechnologie 3 Softwaretechnologie + preis(): int 4 Zentrale Frage: ► Wie bilde ich einseitige Assoziationen aus UML auf Java ab? ► Antwort 1: durch Abbildung auf Arrays 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 5 Softwaretechnologie Bestellung("TUD"); Bestellposition(tisch,1)); Bestellposition(stuhl,4)); Bestellposition(schrank,2)); Bestellung fuer Kunde TUD 0. 1 x Tisch Einzelpreis: 200 Summe: 200 1. 4 x Stuhl Einzelpreis: 100 Summe: 400 2. 2 x Schrank Einzelpreis: 300 Summe: 600 Auftragssumme: 1200 Softwaretechnologie Testprogramm für Anwendungsbeispiel (2) Einfache Realisierung mit Arrays (1) public static void main (String[] args) { ... b1.sonderpreis(1,50); b1.print(); } class Bestellung { 6 private String kunde; private Bestellposition[] liste; private int anzahl = 0; public Bestellung(String kunde) { this.kunde = kunde; liste = new Bestellposition[20]; } Bestellung fuer Kunde TUD 0. 1 x Tisch Einzelpreis: 200 Summe: 200 1. 4 x Stuhl Einzelpreis: 50 Summe: 200 2. 2 x Schrank Einzelpreis: 300 Summe: 600 Auftragssumme: 1000 Softwaretechnologie 7 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 ! } Softwaretechnologie 8 Einfache Realisierung mit Arrays (2) Probleme der Realisierung mit Arrays ► 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; } ... ► 9 ► Meiste Standard-Datenstrukturen abgedeckt ■ Verwendung von Vererbung zur Strukturierung ■ Flexibel auch zur eigenen Erweiterung Was passiert, wenn keine Ordnung benötigt wird? Kann das Array sortiert werden? Viele Algorithmen laufen auf sortierten Universen wesentlich schneller als auf unsortierten (z.B. Queries in Datenbanken) ► Wie bilde ich einseitige Assoziationen aus UML auf Java ab? ► Antwort 3: durch Abbildung auf die Schnittstelle Collection Bestellung – kunde: String + neuePosition(b: Bestellposition) + löschePosition(pos int) +sonderpreis(pos: int, preis: int) + auftragssumme(): int + print() 1 Erst seit Java 1.2 (Java-2) Standard . ■ java.util. Antwort: Einziehen von Behälterklassen (collections) aus dem Collection-Framework Flachklopfen (lowering) von Sprachkonstrukten: Wir klopfen Assoziationen zu Java-Behälterklassen flach. Softwaretechnologie Bestellung – kunde: String + neuePosition(b: Bestellposition) + löschePosition(pos int) +sonderpreis(pos: int, preis: int) + auftragssumme(): int + print() 1 * Bestellposition – anzahl: String – preis: int Bestellposition – anzahl: String – preis: int + einzelpreis(): int + einzelpreis(p: int) + positionspreis(): int + einzelpreis(): int + einzelpreis(p: int) + positionspreis(): int für * für 1 Softwaretechnologie + preis(): * * 1 Artikel – name: String – preis: int 11 1 {ordered} <<interface>> Collection {ordered} Zentrale Frage: Wie bilde ich einseitige Assoziationen aus UML auf Java ab? ■ 10 Softwaretechnologie Basiert auf Java Generic Library (JGL) der Firma ObjectSpace ■ ► Automatisches Verschieben bei Löschen Ersetzen von “*”-Assoziationen durch Behälterklassen Probleme werden durch das Java-Collection-Framework gelöst, eine objektorientierte Datenstrukturbibliothek für Java ■ Obergrenze erweiterbar ■ Flachklopfen von Assoziationen auf Behälterklassen Collections ► ■ ■ } Softwaretechnologie Dynamische Arrays ? int Artikel – name: String – preis: int + preis(): int 12 Facetten von Behälterklassen ► Java Collection Framework: Struktur Behälterklassen können anhand von verschiedenen Facetten klassifiziert werden ■ <<interface>> Collection Facetten sind orthogonale Dimensionen einer Klassifikation oder eines Modells Ordnung Ordnung Duplikate Sortierung geordnet ungeordnet mit Duplikaten ohne Duplikate sortiert unsortiert <<interface>> List Schlüssel mit Schlüssel ohne Schlüssel Schlüssel Duplikate <<interface>> Set <<interface>> Map Sortierung <<interface>> SortedSet <<interface>> SortedMap /home/ua1/Courses/ST1/Material/jdk-1_5_0-doc/index.html Softwaretechnologie 13 Klassifikation der Schnittstellen der Datenstrukturen ► ► ► ► Schnittstelle java.util.Collection (Auszug) Collection (Behälter, Kollektion): ■ Ansammlung von Datenelementen ■ Hinzufügen, Entfernen, Suchen, Durchlaufen <<interface>> Set (Menge): ■ Reihenfolge des Einfügens, Mehrfachvorkommen spielen keine Rolle ■ SortedSet (geordnete Menge): Ordnung auf den Elementen + Sortierung List (Liste): ■ Mehrfachvorkommen werden separat abgelegt ■ Reihenfolge des Einfügens bleibt erhalten Map (Abbildung, mapping, associative array): ■ Zuordnung von Schlüsselwerten auf Eintragswerte ■ Menge von Tupeln: Mehrfachvorkommen bei Schlüsseln verboten, bei Einträgen erlaubt ■ SortedMap (geordnete Abbildung): Ordnung auf den Schlüsseln + Sortierung danach Softwaretechnologie 14 Softwaretechnologie 15 public interface Collection { Collection // Queries // Query methods public boolean isEmpty(); + boolean isEmpty(); contains(Object o); public boolean contains (Object o); ++ boolean boolean equals(Object o); + int hashCode(); public boolean equals(Object o); + Iterator iterator(); public int size(); // Repräsentations-Transpublic int hashCode(); // formierer public Iterator iterator(); + Object[] toArray(); // Repräsentations-Transformierer // Zustandsveränderer public Object[] toArray(); + boolean add (Object o); + boolean remove (Object o); // Zustandsveränderer + void clear(); public boolean add (Object o); public boolean remove (Object o); public void clear(); … } 16 Softwaretechnologie java.util.List (Auszug) java.util.Set (Auszug) <<interface>> Collection public interface List extends Collection { ► Semantik von add()? public boolean isEmpty(); <<interface>> List public boolean contains (Object o); public int size(); <<interface>> List public boolean add (Object o); public boolean remove (Object o); public void clear(); <<interface>> Set public Object get (int index); public Object set (int index, Object element); // Query methods + Object get(int index); public Object remove (int index); public int indexOf (Object o); ... } 17 Softwaretechnologie Object - Collection - List : Beispiel o : Object // Zustandsveränderer + boolean add (Object o); // Zustandsveränderer + Object remove (int index, Object o); + Object set (int index, Object o); + int indexOf (Object o); Die Klasse "Object" (Wiederholung) • java.lang.Object: allgemeine Eigenschaften aller Objekte. Keine speziellen Operationen anwendbar ■ ■ "instanceOf" o : XCol XCol "implements" Collection 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(); ... add, remove, clear, isEmpty, contains, size "instanceOf" o : XList XList } "implements" • Jede Klasse kann die Standard-Operationen überdefinieren: List – equals: Objektgleichheit (Standard: Referenzgleichheit) – hashCode: Zahlcodierung – toString: Textdarstellung, z.B. für println() add, remove, clear, isEmpty, contains, size, get, set, remove, indexOf Softwaretechnologie 18 Softwaretechnologie 19 Softwaretechnologie 20 Abstrakter und konkreter Datentyp Abstrakter Datentyp (Schnittstelle) Konkreter Datentyp (Implementierung) ► Abstraktion: ■ Operationen ■ Verhalten der Operationen ► ► Theorie: ■ Algebraische Spezifikationen ► Theorie: ■ Datenstrukturen ■ Komplexität ► Praxis: ■ Alternativen ► Beispiel: ■ Verkettete Liste ■ Liste durch Feld . Axiomensysteme ► Praxis: ■ Abstrakte Klassen ■ Interfaces ► Beispiel: ■ List Implementierungen im Collection-Framework Konkretisierung: ■ Instantiierbare Klassen ■ Ausführbare Operationen <<interface>> List Implementierung (implements) <<interface>> Set <<interface>> SortedSet ArrayList LinkedList 21 Softwaretechnologie Vererbung (extends) <<interface>> Collection Beispiel: Implementierungsklasse java.util.ArrayList (Auszug) Softwaretechnologie HashSet <<interface>> Map <<interface>> SortedMap HashMap TreeSet TreeMap 22 The End public class ArrayList implements List { public ArrayList (int initialCapacity); public void ensureCapacity (int minCapacity); ... } ► Diese Folien sind eine überarbeitete Version der Vorlesungsfolien zur Vorlesung Softwaretechnologie von © Prof. H. Hussmann, 2002. used by permission. <<interface>> List ArrayList + ArrayList (int initialCapacity); + void ensureCapacity (int minCapacity); Softwaretechnologie 23 Softwaretechnologie 24