Objektorientierte Implementierung Verfeinern von Assoziationen mit dem Java-2 Collection Framework Softwaretechnologie, © Prof. Uwe Aßmann, Prof. Heinrich Hussmann 1 Objektorientierte Implementierung mit Java-Datenstrukturen 1 Verfeinern von Assoziationen mit dem Java-2 Collection Framework 2 Programmieren gegen Schnittstellen 3 Auswahl von Datenstrukturen 4 Persistente Datenhaltung Softwaretechnologie 2 Obligatorische Literatur ► JDK Tutorial für J2SE oder J2EE, www.java.sun.com Softwaretechnologie 3 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 Softwaretechnologie 5 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) 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. Softwaretechnologie 11 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 Schlüssel geordnet ungeordnet mit Duplikaten ohne Duplikate sortiert unsortiert mit Schlüssel ohne Schlüssel Softwaretechnologie 13 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/Ressourcen/jdk-1_5_0-doc/index.html Softwaretechnologie 14 Klassifikation der Schnittstellen der 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, mapping, associative array): ■ Zuordnung von Schlüsselwerten auf Eintragswerte ■ Mehrfachvorkommen bei Schlüsseln verboten, bei Einträgen erlaubt SortedMap (geordnete Abbildung): Ordnung auf den Schlüsseln + Softwaretechnologie Sortierung danach ■ 15 Schnittstelle java.util.Collection (Auszug) public interface Collection { // Queries public boolean isEmpty(); public boolean contains (Object o); public boolean equals(Object o); public int size(); // Repräsentations-Transformierer public Object[] toArray(); // Zustandsveränderer public boolean add (Object o); public boolean remove (Object o); public void clear(); ... } Softwaretechnologie 16 java.util.List (Auszug) public interface List extends Collection { public public public public public public boolean isEmpty(); boolean contains (Object o); int size(); boolean add (Object o); boolean remove (Object o); void clear(); public public public public ... Object get (int index); Object set (int index, Object element); Object remove (int index); int indexOf (Object o); } Softwaretechnologie 17 java.util.Set (Auszug) public interface Set { public public public public public public public ... public ... public boolean isEmpty(); boolean contains (Object o); int size(); boolean add (Object o); // Semantik?? boolean remove (Object o); void clear(); boolean equals (Object o); int hashCode(); Iterator iterator(); } 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 Softwaretechnologie 19 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 Konkreter Datentyp (Implementierung) Abstrakter Datentyp (Schnittstelle) Konkretisierung: Abstraktion: ► ► ■ Instantiierbare Klassen ■ Operationen ■ Ausführbare Operationen ■ Verhalten der Operationen Theorie: ■ Datenstrukturen ■ Komplexität Praxis: ■ ► ► ■ ■ Verkettete Liste ■ Liste durch Feld Softwaretechnologie Algebraische Spezifikationen . ► Alternativen Beispiel: Theorie: ► Axiomensysteme Praxis: ■ Abstrakte Klassen ■ Interfaces Beispiel: ■ List 21 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 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); ... } 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