collections

Werbung
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
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)
►
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.
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
geordnet
ungeordnet
mit Duplikaten
ohne Duplikate
sortiert
unsortiert
Softwaretechnologie
Schlüssel
mit Schlüssel
ohne Schlüssel
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/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>>
Collection
public interface 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);
...
}
Softwaretechnologie
// Zustandsveränderer
+ Object remove (int index,
Object o);
+ Object set (int index, Object o);
+ int indexOf (Object o);
17
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
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
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
Softwaretechnologie
Konkretisierung:
■ Instantiierbare Klassen
■ Ausführbare Operationen
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 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
Herunterladen