Softwaretechnologie, © Prof. Uwe Aßmann
Technische Universität Dresden, Fakultät Informatik 1
"Der Aufrufer programmiert gegen die Schnittstelle, er befindet sich sozusagen im luftleeren Raum."
Siedersleben/Denert,
Wie baut man Informationssysteme, Informatik-Spektrum, August 2000
Teil II) Objektorientierte Implementierung
11) Programmieren gegen Schnittstellen
Prof. U. Aßmann, Softwaretechnologie 2
Objektorientierte Implementierung mit Java-Datenstrukturen
10 Verfeinern von Assoziationen mit dem Java-2 Collection Framework 11 Programmieren gegen Schnittstellen
Auswahl von Datenstrukturen Persistente Datenhaltung
Prof. U. Aßmann, Softwaretechnologie 3
Schnittstellen und Implementierungen im Collection-Framework
<<interface>>
Collection
<<interface>>
Map
<<interface>>
SortedSet <<interface>>
SortedMap LinkedList
ArrayList
HashSet
TreeSet
HashMap
TreeMap
<<interface>>
Set
<<interface>>
List
Vererbung (extends)
Implementierung (implements)
<<interface>>
Queue
PriorityQueue Vector
Stack
Prof. U. Aßmann, Softwaretechnologie 4
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);
}...
Typanpassungen mit Schnittstellen:
Geordnete Listen mit ArrayList (1)
Prof. U. Aßmann, Softwaretechnologie 5
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
defi niert aufBestellposition Object
Spezialisierung von Object auf Bestellposition?
Prof. U. Aßmann, Softwaretechnologie 6
Typanpassungen auf Elementtypen
Bestellung – kunde: String
– anzahl: int liste
java.util.ArrayList add(Object o) get(pos: int): Object
...
1
Object
*
Bestell- position
*
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(pos) Zusicherung: Alle von einem Bestellung-Objekt über die liste-Assoziation erreichbaren Objekte
sind aus der Klasse Bestellposition.
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
Geordnete Collections II - 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:Bestellung3.javamit LinkedList:
Softwaretechnologie, © Prof. Uwe Aßmann, Prof. Heinrich Hussmann 9
11.1 Polymorphe Container durch Schnittstellen
Prof. U. Aßmann, Softwaretechnologie 10
Programmieren gegen Schnittstellen
-- Polymorphe Container
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);
}
List ist ein Interface, keine Klasse !
!
Prof. U. Aßmann, Softwaretechnologie 11
• ArrayList:
class Bestellung { private String kunde;
private List liste;
public Bestellung(String kunde) { this.kunde = kunde;
this.liste = new ArrayList();
} ...
• LinkedList:
class Bestellung { private String kunde;
private List liste;
public Bestellung(String kunde) { this.kunde = kunde;
this.liste = new LinkedList();
} ...
Polymorphe Container:
Wechsel der Datenstruktur
List ist ein Interface, keine Klasse !
!
Code muß bei Wechsel der Datenstruktur nur an einer Stelle (Konstruktor) geändert werden !
Prof. U. Aßmann, Softwaretechnologie 12
Standardalgorithmen in der Algorithmenklasse java.util.Collections
► Algorithmenklassen enthalten Algorithmen, die auf einer Familie
von anderen Klassen arbeiten
■ Hier: java.util.Collections enthält Algorithmen auf beliebigen Klassen, die das Collection- bzw. List-Interface implementieren
■ Bei manchen Operationen ist Ordnung auf Elementen vorausgesetzt.
■ Achtung: Statische Operationen!
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) ...
}
Prof. U. Aßmann, Softwaretechnologie 13
Prädikat-Schnittstellen (...able Schnittstellen)
► Prädikat-Schnittstellen drücken bestimmte Eigenschaft einer Klasse
aus. Sie werden oft mit dem Suffix “able” benannt:
■ Iterable
■ Clonable
■ Serializable
►
Beispiel: geordnete Standarddatentypen (z.B. String oder List) implementieren die Prädikatschnittstelle Comparable:
public interface Comparable { public int compareTo (Object o);
}
►
Resultat ist kleiner/gleich/größer 0:
genau dann wenn "this" kleiner/gleich/größer als Objekt o
Softwaretechnologie, © Prof. Uwe Aßmann
Technische Universität Dresden, Fakultät Informatik 14
11.2 Entwurfsmuster Iterator
Entwurfsmuster Iterator (Implementierungsmuster)
►
Name: Iterator (auch: Stream, Cursor, Enumeration)
►
Problem: Sequentielles, polymorphes Durchlaufen der Elemente eines strukturieren Objekts oder einer Collection.
■ Aufzählen der in einem “Behälter” befindlichen Elemente durch Herausziehen (pull)
■ Keine Aussage über die Reihenfolge!
►
Lösung:
elements(): Iterator
Container
Element
next() hasNext()
Iterator
ConcreteIterator {abstract}
<<create>>
pull..
*
Iterator-Beispiel in der JDK (ArrayList)
Bestellung 1 – kunde: String
– anzahl: int liste
Object java.util.ArrayList
add(o: Object) get(pos: int): Object
iterator(): Iterator ...
*
<<create>>
<<interface>>
java.util.Iterator hasNext()
next()
Concrete Iterator Aggregate
Element Iterator
Klassenname nicht bekannt, weil privat (z.B. ArrayListIterator)
Prof. U. Aßmann, Softwaretechnologie 17
Iterator-Implementierungsmuster
►
Verwendungsbeispiel:
List list;
.. Iterator i = list.iterator();
while (i.hasNext()) {
doSomeThing(i.next());
}
List list;
.. Iterator i = list.iterator();
while (i.hasNext()) {
doSomeThing(i.next());
}
Prof. U. Aßmann, Softwaretechnologie 18
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
Softwaretechnologie, © Prof. Uwe Aßmann, Prof. Heinrich Hussmann 19
11.3 Auswahl von Implementierungen von Datenstrukturen
Prof. U. Aßmann, Softwaretechnologie 20
Weitere Implementierungen in der Collection- Hierarchie
<<interface>>
Collection
<<interface>>
Set
<<interface>>
SortedSet
<<interface>>
List <<interface>>
Map
<<interface>>
SortedMap
LinkedList ArrayList
TreeSet HashSet
TreeMap HashMap
Vererbung (extends)
Implementierung (implements)
Vector Hashtable
Prof. U. Aßmann, Softwaretechnologie 21
Welche Listen-Implementierung soll man wählen?
►
Innere Schleifen bilden die „heißen Punkte“ (hot spots) eines Programms
■ Optimierung von inneren Schleifen durch Auswahl von Implementierungen mit geeignetem Zugriffsprofil
►
Gemessener relativer Aufwand für Operationen auf Listen:
(aus Eckel, Thinking in Java, 2nd ed., 2000)
■ Stärken von ArrayList: wahlfreier Zugriff
■ Stärken von LinkedList: Iteration, Einfügen und Entfernen irgendwo in der Liste
■ Vector generell die langsamste Lösung
Typ Lesen Iteration Einfügen Entfernen
array 1430 3850 -- --
ArrayList 3070 12200 500 46850
LinkedList 16320 9110 110 60
Vector 4890 16250 550 46850
Prof. U. Aßmann, Softwaretechnologie 22
Collection Framework (Überblick) (Mengen ohne Mehrfacheintrag)
<<interface>>
Collection
<<interface>>
Set
<<interface>>
SortedSet
<<interface>>
List <<interface>>
Map
<<interface>>
SortedMap
LinkedList ArrayList
TreeSet HashSet
TreeMap HashMap
Vererbung (extends)
Implementierung (implements)
Ungeordnete Mengen: java.util.Set (Auszug)
// Query methods + Object get(int index);
// Zustandsveränderer + boolean add (Object o);
<<interface>>
Set // Query methods
+ boolean isEmpty();
+ boolean contains(Object o);
+ boolean equals(Object o);
+ int hashCode();
+ Iterator iterator();
// Repräsentations-Trans- // formierer
+ Object[] toArray();
// Zustandsveränderer + boolean add (Object o);
+ boolean remove (Object o);
+ void clear();
<<interface>>
Collection
Anwendungsbeispiel für Set
Artikel – name: String
– preis: int + preis(): int Warengruppe – name: String – lagerplatz: String
*
1+ add (a: Artikel) + anzahl(): int
Prof. U. Aßmann, Softwaretechnologie 25
java.util.HashSet (Auszug)
(Anmerkung: Erläuterung von Hashfunktionen folgt etwas später !)
// Query methods + Object get(int index);
// Zustandsveränderer + boolean add (Object o);
<<interface>>
// Query methods Set + boolean isEmpty();
+ boolean contains(Object o);
+ boolean equals(Object o);
+ int hashCode();
+ Iterator iterator();
// Repräsentations-Trans- // formierer
+ Object[] toArray();
// Zustandsveränderer + boolean add (Object o);
+ boolean remove (Object o);
+ void clear();
<<interface>>
Collection
// Konstruktor
# HashSet(int initialCapacity, float loadFactor);
+ Object get(int index);
+ int hashCode() // Zustandsveränderer + boolean add (Object o);
<<interface>>
HashSet
Prof. U. Aßmann, Softwaretechnologie 26
Anwendungsbeispiel mit HashSet
class Warengruppe { private String name;
private String lagerplatz;
private Set inhalt;
public Warengruppe
(String name, String lagerplatz) { this.name = name;
this.lagerplatz = lagerplatz;
this.inhalt = new HashSet();
}
public void add (Artikel a) { inhalt.add(a); }
public int anzahl() { return inhalt.size(); }
public String toString() {
String s = "Warengruppe "+name+"\n";
Iterator it = inhalt.iterator();
while (it.hasNext()) {
s += " "+(Artikel)it.next();
};
} }
Online:
Warengruppe0.java
Prof. U. Aßmann, Softwaretechnologie 27
Wann sind Objekte gleich? (1)
►
Vergleich mit Operation == :
■ Referenzgleichheit, d.h. physische Identität der Objekte
■ Typischer Fehler: Stringvergleich mit "=="
(ist nicht korrekt, geht aber meistens gut!)
►
Vergleich mit o.equals()
:■ deklariert in java.lang.Object
■ überdefiniert in vielen Bibliotheksklassen
♦ z.B. java.lang.String
■ für selbstdefinierte Klassen
♦ Standardbedeutung Referenzgleichheit
♦ bei Bedarf selbst überdefinieren !
(Ggf. für kompatible Definition der Operation o.hashCode() aus
java.lang.Object sorgen) Online:
Warengruppe1.java
Prof. U. Aßmann, Softwaretechnologie 28
Wann sind Objekte gleich? (2) Referenzgleichheit
public static void main (String[] args) {
Warengruppe w1 = new Warengruppe("Moebel","L1");
w1.add(new Artikel("Tisch",200));
w1.add(new Artikel("Stuhl",100));
w1.add(new Artikel("Schrank",300));
w1.add(new Artikel("Tisch",200));
System.out.println(w1);
}
Systemausgabe beim Benutzen der Standard-Gleichheit:
Warengruppe Moebel
Tisch(200) Tisch(200) Schrank(300) Stuhl(100)
Online:
Warengruppe0.java
Prof. U. Aßmann, Softwaretechnologie 29
Wann sind Objekte gleich? (3) Referenzgleichheit
public static void main (String[] args) { Artikel tisch = new Artikel("Tisch",200);
Artikel stuhl = new Artikel("Stuhl",100);
Artikel schrank = new Artikel("Schrank",300);
Warengruppe w2 = new Warengruppe("Moebel","L2");
w2.add(tisch);
w2.add(stuhl);
w2.add(schrank);
w2.add(tisch);
System.out.println(w1);
}
Systemausgabe:
Warengruppe Moebel
Schrank(300) Tisch(200) Stuhl(100)
Es wurde zweifach dasselbe Tisch-Objekt übergeben !
(Gleiches Verhalten bei Strukturgleichheit, s. Warengruppe1.java)
Prof. U. Aßmann, Softwaretechnologie 30
java.util.SortedSet (Auszug)
// Query methods + Object get(int index);
// Zustandsveränderer + boolean add (Object o);
<<interface>>
// Query methods Set + boolean isEmpty();
+ boolean contains(Object o);
+ boolean equals(Object o);
+ int hashCode();
+ Iterator iterator();
// Repräsentations-Trans- // formierer
+ Object[] toArray();
// Zustandsveränderer + boolean add (Object o);
+ boolean remove (Object o);
+ void clear();
<<interface>>
Collection
+ Object first();
+ Object last()
<<interface>>
SortedSet
java.util.TreeSet
►
java.util.TreeSet implementiert ein geordnete Menge mit Hilfe eines Baumes und benötigt zum Sortieren dessen die Schnittstelle
Comparable►
Modifi kation der Klasse Warengruppe:
►
Aber Systemreaktion:
Exception in thread "main" java.lang.ClassCastException: Artikel at java.util.TreeMap.compare(TreeMap.java, Compiled Code)
► in java.util.TreeSet:
public class TreeSet … implements SortedSet … { … }
class Warengruppe { private Set inhalt;
public Warengruppe (…) { …
this.inhalt = new TreeSet();
} … }
class Artikel implements Comparable { ...
public int compareTo (Object o) {
return name.compareTo(((Artikel)o).name);
} }
Anwendungsbeispiel mit TreeSet
►
Artikel muss zusätzlich von Schnittstelle
Comparableerben
►
Modifikation der Klasse „Artikel“:
Systemausgabe:
Warengruppe Moebel
Schrank(300) Stuhl(100) Tisch(200)
Online:
Warengruppe3.java
Prof. U. Aßmann, Softwaretechnologie 33
HashSet oder TreeSet?
►
Gemessener relativer Aufwand für Operationen auf Mengen:
(aus Eckel, Thinking in Java, 2nd ed., 2000)
►
Stärken von HashSet:
■ in allen Fällen schneller !
►
Stärken von TreeSet:
■ erlaubt Operationen für sortierte Mengen
Typ Einfügen Enthalten Iteration
HashSet 36,14 106,5 39,39
TreeSet 150,6 177,4 40,04
Prof. U. Aßmann, Softwaretechnologie 34
Collection Framework (Überblick) (Maps)
<<interface>>
Collection
<<interface>>
Set
<<interface>>
SortedSet
<<interface>>
List <<interface>>
Map
<<interface>>
SortedMap
LinkedList ArrayList
TreeSet HashSet
TreeMap HashMap
Vererbung (extends)
Implementierung (implements)
Prof. U. Aßmann, Softwaretechnologie 35
java.util.Map (Auszug)
<<interface>>
HashMap
// Anfragen (query methods) + int size();
+ boolean isEmpty();
+ boolean containsKey(Object key);
+ boolean containsValue(Object value);
+ Object get (Object key);
+ int hashCode();
+ Iterator iterator();
+ Set keySet();
+ Set values();
// Zustandsveränderer + void clear();
+ Object put (Object key, Object value);
+ boolean remove (Object o);
<<interface>>
Map
►
Eine Map ist ein „assoziativer Speicher“ (associative array), der Objekte als Werte (value) unter Schlüsseln (key) zugreifbar macht
■ Ein Schlüssel liefert einen Wert (Funktion).
■ Map liefert funktionale Abhängigkeit zwischen Schlüssel und Wert
Prof. U. Aßmann, Softwaretechnologie 36
Anwendungsbeispiel
Artikel – name: String
– preis: int + preis(): int
Katalog – name: String
1
+ put (code: String, a: Artikel) + get (code: String): Artikel
+ anzahl(): int code: String
*
HashMap ist eine
sehr günstige Umsetzung für qualifizierte Assoziationen:
Der Qualifikator bildet den Schlüssel;
die Zielobjeke den Wert Hier:
•Schlüssel: code:String
•Wert: a:Artikel
Prof. U. Aßmann, Softwaretechnologie 37
Anwendungsbeispiel mit HashMap
class Katalog {
private String name;
private Map inhalt;
public Katalog (String name) { this.name = name;
this.inhalt = new HashMap();
}
public void put (String code, Artikel a) { inhalt.put(code,a);
}
public int anzahl() { return inhalt.size();
}
public Artikel get (String code) { return (Artikel)inhalt.get(code);
} ...
}
Online:Katalog.javaProf. U. Aßmann, Softwaretechnologie 38
Testprogramm für Anwendungsbeispiel:
Speicherung der Waren mit Schlüsseln
public static void main (String[] args) { Artikel tisch = new Artikel("Tisch",200);
Artikel stuhl = new Artikel("Stuhl",100);
Artikel schrank = new Artikel("Schrank",300);
Artikel regal = new Artikel("Regal",200);
Katalog k = new Katalog("Katalog1");
k.put("M01",tisch);
k.put("M02",stuhl);
k.put("M03",schrank);
System.out.println(k);
k.put("M03",regal);
System.out.println(k);
}
Katalog Katalog1 M03 -> Schrank(300) M02 -> Stuhl(100) M01 -> Tisch(200) Katalog Katalog1 M03 -> Regal(200) M02 -> Stuhl(100) M01 -> Tisch(200)
Systemausgabe:
put(...) überschreibt vorhandenen Eintrag (Ergebnis = vorhandener Eintrag).
Ordnung auf den Schlüsseln: SortedMap (Implementierung z.B.TreeMap).
value: Object
Prinzip der Hashtabelle
Effekt von hashtab.put(key,value)
key.hashCode()
Object hashCode(): int
key: Object
value: Object
0
capacity
hashtab
►
Typischerweise wird der Schlüssel (key) transformiert:
■ Das Objekt liefert seinen Hashwert mit der Hash-Funktion hashCode()
■ Mit dem Hashwert wird in eine Hashtabelle eingestochen, d.h. der Hashwert wird auf einen Zahlenbereich modulo der Kapazität der Hashtabelle abgebildet, d.h., der Hashwert wird auf die Hashtabelle
“normiert”
value?: Object
Kollision beim Einstechen
0
capacity key1: Object
value1: Object
key2: Object value2: Object
key1.hashCode()
= key2.hashCode()
Verfahren zur Kollisionsauflösung:
– Überlauflisten
– Überlauf in der Hashtabelle
►
Die Hashfunktion ist mehrdeutig (nicht injektiv):
■ Bei nicht eindeutigen Schlüsseln, oder auch durch die Normierung, werden Einträge doppelt “adressiert” (Kollision)
Prof. U. Aßmann, Softwaretechnologie 41
Vorgehensweise beim Datenstruktur-Entwurf
Identifi kation der Anforderungen an die Datenstruktur:
Funktionalität, häufi g benutzte Operationen
Abstraktion auf die wesentlichen Eigenschaften
Suche nach vorgefertigten Lösungen (Nutzung der Collection-Bibliothek)
Ggf. Experimente (experimentelle Prototypen)
Anpassung an vorgefertigte Lösung
Entwicklung einer neuartigen Lösung
Prof. U. Aßmann, Softwaretechnologie 42
Suche nach vorgefertigten Lösungen (Collection-Klassen der Bibliothek)
Einfügen eines Elements Entfernen eines Elements Aufzählen aller Elemente
"ist enthalten"-Abfrage dynamisch erweiterbar
Collection
Einfügen eines Werts für einen Schlüssel Entfernen eines Schlüssel/Wert-Paars Abfrage eines Werts für einen Schlüssel
"ist enthalten"-Abfrage für Schlüssel dynamisch erweiterbar
Map
Einfügereihenfolge relevant?
List
Abfrage an i-ter Position Ersetzen an i-ter Position Entfernen an i-ter Position
ja nein
Set
kleinstes/größtes Element Elemente "über"/"unter" x
SortedSet
Sortierung relevant?
Sortierung der Schlüssel relevant?
SortedMap
Prof. U. Aßmann, Softwaretechnologie 43
Beispiel: Realisierung von Assoziationen
A * B
assoc
Anforderung Realisierung
1) Assoziation anlegen 2) Assoziation entfernen
3) Durchlaufen aller bestehenden Assoziationen zu B-Objekten 4) Manchmal: Abfrage, ob
Assoziation zu einem B-Objekt besteht 5) Keine Obergrenze der
Multiplizität gegeben
Datenstruktur im A-Objekt für B-Referenzen
1) Einfügen (ohne Reihenfolge) 2) Entfernen (ohne Reihenfolge) 3) Aufzählen aller Elemente 4) "ist enthalten"-Abfrage
5) Maximalanzahl der Elemente unbekannt;
dynamisch erweiterbar
Set
Prof. U. Aßmann, Softwaretechnologie 44
Realisierung von ungeordneten Assoziationen mit Set
A assoc * B
class A {
private Set assoc;
...
public void addAssoc (B b) { assoc.add(b);
}
public boolean testAssoc (B b) { return assoc.contains(b);
}
public A { ...
assoc = new HashSet();
}
Prof. U. Aßmann, Softwaretechnologie 45
Beispiel: Raumverwaltung
static Besprechungsraum freienRaumSuchen (int groesse, Hour beginn, int dauer)
►
Suche unter vorhandenen Räumen nach Raum mit mindestens der Kapazität groesse, aber möglichst klein.
■ Datenstruktur für vorhandene Räume in Klasse Raumverwaltung
» SortedSet (Elemente: Besprechungsraum)
►
Überprüfung eines Raumes, ob er für die Zeit ab beginn für die Länge dauer bereits belegt ist.
■ Operation in Klasse Besprechungsraum:
boolean frei (Hour beginn, int dauer)
■ Datenstruktur in Klasse Besprechungsraum für Zeiten (Stunden):
» Set (Elemente: Hour)
►
Zusatzanforderung (Variante): Überprüfung, welcher andere Termin eine bestimmte Stunde belegt.
■ Datenstruktur in Klasse Besprechungsraum:
» Map (Schlüssel: Hour, Wert: Teambesprechung)
Prof. U. Aßmann, Softwaretechnologie 46
Raumverwaltung: Freien Raum suchen
class Raumverwaltung {
// Vorhandene Raeume, aufsteigend nach Größe sortiert // statisches Klassenattribut und -methode
private static SortedSet vorhandeneRaeume
= new TreeSet();
// Suche freien Raum aufsteigend nach Größe static Besprechungsraum freienRaumSuchen
(int groesse, Hour beginn, int dauer) { Besprechungsraum r = null;
boolean gefunden = false;
Iterator it = vorhandeneRaeume.iterator();
while (! gefunden && it.hasNext()) { r = (Besprechungsraum)it.next();
if (r.grossGenug(groesse)&& r.frei(beginn,dauer)) gefunden = true;
};
if (gefunden) return r;
else
return null;
} ...
}
Softwaretechnologie, © Prof. Uwe Aßmann, Prof. Heinrich Hussmann 47
11.4 Persistente Datenhaltung
Art is long, and Time is fleeting.
H. W. Longfellow
Temporäre und persistente Daten
►
Daten sind
■ temporär, wenn sie mit Beendigung des Programms verloren gehen, das sie verwaltet;
■ persistent, wenn sie über die Beendigung des verwaltenden Programms hinaus erhalten bleiben.
►
Objektorientierte Programme benötigen Mechanismen zur Realisierung der Persistenz von Objekten.
►
Möglichkeiten zur Realisierung von Objekt-Persistenz:
■ Einsatz eines Datenbank-Systems
♦ Objektorientiertes Datenbank-System
♦ Relationales Datenbank-System
Java: Java Data Base Connectivity (JDBC)
♦ Zugriffsschicht auf Datenhaltung Java: Java Data Objects (JDO)
■ Speicherung von Objektstrukturen in Dateien
♦ Objekt-Serialisierung (Object Serialization)
Prof. U. Aßmann, Softwaretechnologie 49
Objekt-Serialisierung in Java
►
Die Klassen java.io.ObjectOutputStream
undjava.io.ObjectInputStream stellen Methoden bereit, um ein Geflecht von Objekten linear darzustellen (zu serialisieren) bzw. aus dieser Darstellung zu rekonstruieren.
►
Eine Klasse, die Serialisierung zulassen will, muß die (leere!) Schnittstelle java.io.Serializable
implementieren.class ObjectOutputStream {
public ObjectOutputStream (OutputStream out) throws IOException;
public void writeObject (Object obj) throws IOException;
}
Prof. U. Aßmann, Softwaretechnologie 50
Objekt-Serialisierung: Abspeichern
import java.io.*;
class XClass implements Serializable { private int x;
public XClass (int x) { this.x = x;
} } ...
XClass xobj;
...
FileOutputStream fs = new FileOutputStream("Xfile.dat");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(xobj);
...
Prof. U. Aßmann, Softwaretechnologie 51
Objekt-Serialisierung: Einlesen
import java.io.*;
class XClass implements Serializable { private int x;
public XClass (int x) { this.x = x;
} } ...
XClass xobj;
...
FileInputStream fs = new FileInputStream("Xfile.dat");
ObjectInputStream os = new ObjectInputStream(fs);
xobj = (XClass) os.readObject();
Prof. U. Aßmann, Softwaretechnologie 52
The End
►