2 Folien/Seite

Werbung
5. Objektorientierte Implementierung
mit Java-Datenstrukturen
5.1
5.2
5.3
5.4
Java-2 Collection Framework
Generisches Programmieren
Auswahl von Datenstrukturen
Ausnahmebehandlung in Java
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
OO-Design und Nicht-OO-Sprache
• Elementare Konzepte der Objektorientierung lassen sich teilweise
befriedigend in modularen Sprachen wiedergeben:
– Verhalten:
– Zustand:
– Identität:
Zusammenfassung von Prozeduren in Modulen
Datengeheimnis von Modulen
Zeigertypen
• Nichtmodulare Sprachen (z.B. Original-Pascal) sind dagegen
praktisch ungeeignet für OO-Entwurf.
• Fortgeschrittene Konzepte der Objektorientierung lassen sich in
jedem Fall nur mit Hilfskonstruktionen darstellen, insbesondere:
– Vererbung, vor allem von Operationen
– Polymorphie
• Mögliche Strategien:
– Im Entwurf Vererbung und Polymorphie entfernen
– Einsatz von Werkzeugen (Präprozessoren)
– OO-Erweiterung der Sprache (z.B. Object-COBOL)
T echnische Universität Dresden
Prof. Hußmann
Seite 1
Softwaretechnologie
5. Objektorientierte Implementierung
5.1 Java-2 Collection Framework
T echnische Universität Dresden
Prof. Hußmann
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
T echnische Universität Dresden
Prof. Hußmann
Seite 2
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
für
1
+ einzelpreis(): int *
+ einzelpreis(p: int)
+ positionspreis(): int
T echnische Universität Dresden
Artikel
– name: String
– preis: int
+ preis(): int
Prof. Hußmann
Softwaretechnologie
Testprogramm für Anwendungsbeispiel
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();
Bestellung("TUD");
Bestellposition(tisch,1));
Bestellposition(stuhl,4));
Bestellposition(schrank,2));
b1.sonderpreis(1,50);
b1.print();
}
T echnische 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) {
// was passiert bei mehr als 20 Positionen ?
liste[anzahl] = b;
anzahl++;
}
public void loeschePosition (int pos) {
// geht mit Arrays nicht einfach zu realisieren !
}
T echnische 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
T echnische Universität Dresden
Prof. Hußmann
Seite 4
Softwaretechnologie
Java-2 Collection Framework
• Objektorientierte Datenstrukturbibliothek für Java
– Meiste 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
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
Java Collection Framework: Struktur
<<interface>>
Collection
<<interface>>
<<interface>>
<<interface>>
List
Set
Map
T echnische Universität Dresden
<<interface>>
<<interface>>
SortedSet
SortedMap
Prof. Hußmann
Seite 5
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
• 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
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
java.util.Collection (Auszug)
public interface Collection {
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();
boolean equals (Object o);
int hashCode();
Iterator iterator();
}
T echnische Universität Dresden
Prof. Hußmann
Seite 6
Softwaretechnologie
java.util.List (Auszug)
public interface List extends Collection {
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 boolean remove (int index);
public int indexOf (Object o);
...
}
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
Die Klasse "Object"
• 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()
T echnische Universität Dresden
Prof. Hußmann
Seite 7
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(...)
T echnische 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:
"this" kleiner/gleich/größer als Objekt o
Standarddatentypen (z.B. String) implementieren Comparable
T echnische Universität Dresden
Prof. Hußmann
Seite 8
Softwaretechnologie
Abstrakter und konkreter Datentyp
Abstrakter Datentyp
(Schnittstelle)
• Abstraktion:
Konkreter Datentyp
(Implementierung)
• Konkretisierung:
– Operationen
– Verhalten der Operationen
– Instantiierbare Klassen
– Ausführbare Operationen
• Theorie:
• Theorie:
– Algebraische Spezifikationen
» Axiomensysteme
• Praxis:
– Datenstrukturen
– Effizienzfragen
• Praxis:
– Abstrakte Klassen
– Interfaces
– Alternativen
• Beispiel:
• Beispiel:
– List
– Verkettete Liste
– Array
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
Implementierungen im Collection-Framework
<<interface>>
Vererbung (extends)
Collection
Implementierung (implements)
<<interface>>
<<interface>>
<<interface>>
List
Set
Map
ArrayList
LinkedList
T echnische Universität Dresden
<<interface>>
<<interface>>
SortedSet
SortedMap
HashSet
TreeSet
Prof. Hußmann
Seite 9
HashMap
TreeMap
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 boolean remove (int index);
public int indexOf (Object o);
public ArrayList (int initialCapacity);
public void ensureCapacity (int minCapacity);
...
}
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
5. Objektorientierte Implementierung
5.2 Generisches Programmieren
"Der Aufrufer programmiert gegen die Schnittstelle,
er befindet sich sozusagen im luftleeren Raum."
Siedersleben/Denert,
Wie baut man Informationssysteme,
Informatik- Spektrum, August 2000
T echnische Universität Dresden
Prof. Hußmann
Seite 10
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;
liste = new ArrayList();
}
public void neuePosition (Bestellposition b) {
liste.add(b);
}
public void loeschePosition (int pos) {
liste.remove(pos);
}
...
T echnische Universität Dresden
Prof. Hußmann
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);
T echnische Universität Dresden
Prof. Hußmann
Seite 11
Softwaretechnologie
Generisches Programmieren
*
Bestellung
– kunde: String
– anzahl: int
Object
1
java.util.ArrayList
add(Object o)
liste get(pos: int): Object
...
Zusicherung: Alle von einem Bestellung-Objekt
über die liste-Assoziation erreichbaren Objekte
sind aus der Klasse Bestellposition.
*
Bestellposition
Typanpassung (cast):
• Operationen der Oberklasse passen immer
auch auf Objekte der Unterklasse
• Operationen der Unterklasse auf Objekte einer Oberklasse
anzuwenden, erfordert explizite Typanpassung (dynamic cast):
( Typ ) Objekt
hier: (Bestellposition)liste.get(i)
T echnische Universität Dresden
Prof. Hußmann
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();
}
}
T echnische Universität Dresden
Prof. Hußmann
Seite 12
Softwaretechnologie
Iterator-Konzept
• Aufzählen der in einem “Behälter” befindlichen Elemente
– Keine Aussage über die Reihenfolge!
– Interface java.util.Iterator
interface Iterator {
public abstract boolean hasNext();
public abstract 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();
T echnische Universität Dresden
Prof. Hußmann
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;
}
...
}
T echnische Universität Dresden
Prof. Hußmann
Seite 13
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 boolean remove (int index);
public int indexOf (Object o);
public void addFirst (Object o);
public void addLast (Object o);
...
}
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
Wechsel der Datenstruktur
• ArrayList:
class Bestellung {
private String kunde;
private List liste;
public Bestellung(String kunde) {
this.kunde = kunde;
liste = new ArrayList();
} ...
List ist ein Interface,
keine Klasse !
• LinkedList:
class Bestellung {
private String kunde;
private List liste;
public Bestellung(String kunde) {
this.kunde = kunde;
liste = new LinkedList();
} ...
T echnische Universität Dresden
Prof. Hußmann
Seite 14
Softwaretechnologie
Selbstdefinierte Kollektionen
• Eigene Implementierungen der Klassen des CollectionFrameworks, z.B.:
class MyCollection
extends AbstractCollection
implements Collection {
...}
• Standard-Gerüste für Implementierung von Kollektionsklassen:
java.util.AbstractCollection, java.util.AbstractList, ...
• Kollektion muß mindestens definieren:
– add()
– size()
– iterator()
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
MyCollection.java (1)
class MyCollection
extends AbstractCollection implements Collection {
private class Elem {
private Object elem;
private Elem next;
public Elem (Object elem, Elem next) {
this.elem = elem;
this.next = next;
}
}
private Elem start;
private Elem end;
private int size;
...
T echnische Universität Dresden
Prof. Hußmann
Seite 15
Softwaretechnologie
MyCollection.java (2)
class MyCollection ... {
...
public boolean add (Object o) {
Elem e = new Elem(o,null);
if (start == null) start = e;
if (end != null) end.next = e;
end = e;
size++;
return true;
}
public int size() {
return size;
}
...
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
MyCollection.java (3)
class MyCollection ... { ...
private class MyCollectionIterator implements Iterator {
private Elem current;
public MyCollectionIterator() { current = start; }
public boolean hasNext() { return current != null; }
public Object next() {
Object o = current.elem;
current = current.next;
return o;
}
public void remove() {
throw new UnsupportedOperationException(); }
}
public Iterator iterator() {
return new MyCollectionIterator();
}
}
T echnische Universität Dresden
Prof. Hußmann
Seite 16
Softwaretechnologie
Herunterladen