Objektorientierte Implementierung 10) Verfeinern von Assoziationen mit dem Java-2 Collection Framework Softwaretechnologie, © Prof. Uwe Aßmann, Prof. Heinrich Hussmann 1 Objektorientierte Implementierung mit Java-Datenstrukturen 10 Verfeinern von Assoziationen mit dem Java-2 Collection Framework 11 Programmieren gegen Schnittstellen Auswahl von Datenstrukturen Persistente Datenhaltung Softwaretechnologie 2 Obligatorische Literatur ► JDK Tutorial für J2SE oder J2EE, www.java.sun.com 3 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 + einzelpreis(): int + einzelpreis(p: int) + positionspreis(): int für Überladene Namen! * 1 Artikel – name: String – preis: int Softwaretechnologie + preis(): int 4 Zentrale Frage: ► Wie bilde ich einseitige Assoziationen aus UML auf Java ab? ► Antwort 1: durch Abbildung auf Arrays 5 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 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 6 Testprogramm für Anwendungsbeispiel (2) public static void main (String[] args) { ... b1.sonderpreis(1,50); b1.print(); } 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 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 ! } Softwaretechnologie 8 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; } ... } Softwaretechnologie 9 Probleme der Realisierung mit Arrays ► ► ► Dynamische Arrays ? ■ Obergrenze erweiterbar ■ Automatisches Verschieben bei Löschen 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 Softwaretechnologie 10 Collections ► ► Probleme werden durch das Java-Collection-Framework gelöst, eine objektorientierte Datenstrukturbibliothek für Java ■ Meiste Standard-Datenstrukturen abgedeckt ■ Verwendung von Vererbung zur Strukturierung ■ Flexibel auch zur eigenen Erweiterung Basiert auf Java Generic Library (JGL) der Firma ObjectSpace ■ Erst seit Java 1.2 (Java-2) Standard . ► java.util. Zentrale Frage: Wie bilde ich einseitige Assoziationen aus UML auf Java ab? ■ ■ Antwort: Einziehen von Behälterklassen (collections) aus dem Collection-Framework Flachklopfen (lowering) von Sprachkonstrukten: Wir klopfen Assoziationen zu Java-Behälterklassen flach. 11 Softwaretechnologie Flachklopfen von Assoziationen auf Behälterklassen Ersetzen von “*”-Assoziationen durch Behälterklassen Bestellung – kunde: String + neuePosition(b: Bestellposition) + löschePosition(pos int) +sonderpreis(pos: int, preis: int) + auftragssumme(): int + print() 1 Bestellung – kunde: String + neuePosition(b: Bestellposition) + löschePosition(pos int) +sonderpreis(pos: int, preis: int) + auftragssumme(): int + print() <<interface>> Collection 1 {ordered} * 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 * * 1 Artikel – name: String – preis: int Softwaretechnologie + preis(): 1 {ordered} int Artikel – name: String – preis: int + preis(): int 12 Facetten von Behälterklassen ► Behälterklassen können anhand von verschiedenen Facetten klassifiziert werden ■ Facetten sind orthogonale Dimensionen einer Klassifikation oder eines Modells Ordnung Duplikate Sortierung geordnet ungeordnet mit Duplikaten ohne Duplikate sortiert unsortiert Schlüssel mit Schlüssel ohne Schlüssel 13 Softwaretechnologie Java Collection Framework: Struktur <<interface>> Collection Ordnung <<interface>> List 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 14 Klassifikation der Schnittstellen der Datenstrukturen ► ► ► ► Collection (Behälter, Kollektion): ■ Ansammlung von Datenelementen ■ Hinzufügen, Entfernen, Suchen, Durchlaufen 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 15 Schnittstelle java.util.Collection (Auszug) <<interface>> 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) public interface List extends Collection { <<interface>> Collection public boolean isEmpty(); public boolean contains (Object o); public int size(); public boolean add (Object o); public boolean remove (Object o); <<interface>> List public void clear(); 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); ... } // Zustandsveränderer + Object remove (int index, Object o); + Object set (int index, Object o); + int indexOf (Object o); 17 Softwaretechnologie java.util.Set (Auszug) ► Semantik von add()? <<interface>> List <<interface>> Set // Zustandsveränderer + boolean add (Object o); Softwaretechnologie 18 Object - Collection - List : Beispiel o : Object Keine speziellen Operationen anwendbar "instanceOf" o : XCol XCol "implements" Collection add, remove, clear, isEmpty, contains, size "instanceOf" o : XList XList "implements" List add, remove, clear, isEmpty, contains, size, get, set, remove, indexOf 19 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() 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 Konkretisierung: ■ Instantiierbare Klassen ■ Ausführbare Operationen 21 Softwaretechnologie Implementierungen im Collection-Framework Vererbung (extends) <<interface>> Collection <<interface>> List Implementierung (implements) <<interface>> Set <<interface>> SortedSet ArrayList LinkedList Softwaretechnologie HashSet <<interface>> Map <<interface>> SortedMap HashMap TreeSet TreeMap 22 Beispiel: Implementierungsklasse java.util.ArrayList (Auszug) public class ArrayList implements List { public ArrayList (int initialCapacity); public void ensureCapacity (int minCapacity); ... } <<interface>> List ArrayList + ArrayList (int initialCapacity); + void ensureCapacity (int minCapacity); Softwaretechnologie 23 The End ► Diese Folien sind eine überarbeitete Version der Vorlesungsfolien zur Vorlesung Softwaretechnologie von © Prof. H. Hussmann, 2002. used by permission. Softwaretechnologie 24