5. Objektorientierte Implementierung

Werbung
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
Herunterladen