"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
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)
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 auf
Bestellposition 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
Prof. U. Aßmann, Softwaretechnologie 8
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:
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 !
!
• 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) ...
}
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..
*
Prof. U. Aßmann, Softwaretechnologie 16
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)
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
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
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
Prof. U. Aßmann, Softwaretechnologie 24
Anwendungsbeispiel für Set
Artikel – name: String
– preis: int + preis(): int Warengruppe – name: String – lagerplatz: String
*
1
+ add (a: Artikel) + anzahl(): int
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
<<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
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
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();
} … }
Prof. U. Aßmann, Softwaretechnologie 32
class Artikel implements Comparable { ...
public int compareTo (Object o) {
return name.compareTo(((Artikel)o).name);
} }
Anwendungsbeispiel mit TreeSet
►
Artikel muss zusätzlich von Schnittstelle Comparable erben
►
Modifikation der Klasse „Artikel“:
Systemausgabe:
Warengruppe Moebel
Schrank(300) Stuhl(100) Tisch(200)
Online:
Warengruppe3.java
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)
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
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
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”
Prof. U. Aßmann, Softwaretechnologie 40
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)
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
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();
}
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;
} ...
}
11.4 Persistente Datenhaltung
Art is long, and Time is fleeting.
H. W. Longfellow
Prof. U. Aßmann, Softwaretechnologie 48
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)
Objekt-Serialisierung in Java
►
Die Klassen java.io.ObjectOutputStream und
java.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);
...
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
►