11-programming

Werbung
Objektorientierte Implementierung
11) Programmieren gegen Schnittstellen
"Der Aufrufer programmiert gegen die Schnittstelle,
er befindet sich sozusagen im luftleeren Raum."
Siedersleben/Denert,
Wie baut man Informationssysteme,
Informatik-Spektrum, August 2000
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
Schnittstellen und Implementierungen im
Collection-Framework
Vererbung (extends)
<<interface>>
Collection
<<interface>>
List
ArrayList
<<interface>>
Set
Implementierung (implements)
<<interface>>
Queue
<<interface>>
SortedSet
<<interface>>
Map
<<interface>>
SortedMap
LinkedList
Vector
HashSet
TreeSet
Stack
Softwaretechnologie
PriorityQueue
HashMap
TreeMap
3
Typanpassungen mit Schnittstellen:
Geordnete Listen 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);
}
...
Softwaretechnologie
4
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
defi niert auf
Bestellposition
Spezialisierung von Object auf Bestellposition?
Softwaretechnologie
5
Typanpassungen auf Elementtypen
*
Object
Bestellung
– kunde: String
– anzahl: int
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(pos)
Softwaretechnologie
6
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
Softwaretechnologie
7
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:
}
mit LinkedList:
Bestellung3.java
Softwaretechnologie
8
Polymorphe Container durch
Schnittstellen
Softwaretechnologie, © Prof. Uwe Aßmann, Prof. Heinrich Hussmann
9
Programmieren gegen Schnittstellen
-- Polymorphe Container
class Bestellung {
!
List ist ein
Interface,
keine Klasse !
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);
}
Softwaretechnologie
10
Polymorphe Container:
Wechsel der Datenstruktur
• ArrayList:
class Bestellung {
private String kunde;
private List liste;
public Bestellung(String kunde) {
this.kunde = kunde;
this.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;
this.liste = new LinkedList();
} ...
Softwaretechnologie
Code muß bei
Wechsel der
Datenstruktur
nur an einer
Stelle (Konstruktor)
geändert werden !
11
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)
...
}
Softwaretechnologie
12
Prädikat-Schnittstellen (...able Schnittstellen)
►
Schnittstellen, die die Eigenschaft einer Klasse ausdrücken, werden
oft mit dem Suffix “able” benannt:
■
■
■
►
Iterable
Clonable
Serializable
Beispiel: geordnete Standarddatentypen (z.B. String oder List)
implementieren 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
13
Entwurfsmuster Iterator
(Implementierungsmuster)
►
Name: Iterator (auch: Stream, Cursor, Enumeration)
►
Problem: Sequentielles Durchlaufen der Elemente eines
zusammengesetzten Objekts oder einer Collection.
►
■
Aufzählen der in einem “Behälter” befindlichen Elemente
durch Herausziehen (pull)
■
Keine Aussage über die Reihenfolge!
Lösung:
Iterator
{abstract}
pull..
next()
hasNext()
Container
elements(): Iterator
<<create>>
ConcreteIterator
*
Element
Softwaretechnologie
14
Iterator-Beispiel in der JDK (ArrayList)
<<interface>>
java.util.Iterator
Iterator
hasNext()
next()
Aggregate
Bestellung
– kunde: String
– anzahl: int
1
Concrete
Iterator
java.util.ArrayList
add(o: Object)
liste get(pos: int): Object <<create>>
iterator(): Iterator
...
Klassenname nicht
*
Element
Softwaretechnologie
bekannt, weil privat
(z.B. ArrayListIterator)
Object
15
Iterator-Implementierungsmuster
►
Verwendungsbeispiel:
List
List list;
list;
..
..
Iterator
Iterator ii == list.iterator();
list.iterator();
while
(i.hasNext())
while (i.hasNext()) {{
doSomeThing(i.next());
doSomeThing(i.next());
}}
Softwaretechnologie
16
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
17
Objektorientierte Implementierung
mit Java-Datenstrukturen
Auswahl von Datenstrukturen
Softwaretechnologie, © Prof. Uwe Aßmann, Prof. Heinrich Hussmann
18
Weitere Implementierungen in der CollectionHierarchie
Vererbung (extends)
<<interface>>
Collection
<<interface>>
List
Implementierung (implements)
<<interface>>
Set
<<interface>>
Map
<<interface>>
SortedSet
<<interface>>
SortedMap
ArrayList
LinkedList
Vector
Softwaretechnologie
HashSet
HashMap
TreeSet
Hashtable
TreeMap
19
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
array
ArrayList
LinkedList
Vector
Softwaretechnologie
Lesen
1430
3070
16320
4890
Iteration
3850
12200
9110
16250
Einfügen
-500
110
550
Entfernen
-46850
60
46850
20
Collection Framework (Überblick)
(Mengen ohne Mehrfacheintrag)
Vererbung (extends)
<<interface>>
Collection
<<interface>>
List
Implementierung (implements)
<<interface>>
Set
<<interface>>
SortedSet
<<interface>>
Map
<<interface>>
SortedMap
ArrayList
LinkedList
HashSet
HashMap
TreeSet
Softwaretechnologie
TreeMap
21
Ungeordnete Mengen: java.util.Set (Auszug)
<<interface>>
Collection
// 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();
Softwaretechnologie
<<interface>>
Set
// Query methods
+ Object get(int index);
// Zustandsveränderer
+ boolean add (Object o);
22
Anwendungsbeispiel für Set
Warengruppe
– name: String
– lagerplatz: String
+ add (a: Artikel)
+ anzahl(): int
1
*
Artikel
– name: String
– preis: int
+ preis(): int
Softwaretechnologie
23
java.util.HashSet (Auszug)
<<interface>>
Collection
// Query methods
+ boolean isEmpty();
+ boolean contains(Object o);
+ boolean equals(Object o);
+ int hashCode();
+ Iterator iterator();
<<interface>>
Set
// Query methods
+ Object get(int index);
// Zustandsveränderer
+ boolean add (Object o);
// Repräsentations-Trans// formierer
+ Object[] toArray();
// Zustandsveränderer
+ boolean add (Object o);
+ boolean remove (Object o);
+ void clear();
(Anmerkung: Erläuterung von Hashfunktionen
folgt etwas später !)
Softwaretechnologie
<<interface>>
HashSet
// Konstruktor
# HashSet(int initialCapacity,
float loadFactor);
+ Object get(int index);
+ int hashCode()
// Zustandsveränderer
+ boolean add (Object o);
24
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
}
Softwaretechnologie
25
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
Softwaretechnologie
26
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
Softwaretechnologie
27
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)
Softwaretechnologie
28
java.util.SortedSet (Auszug)
<<interface>>
Collection
// 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();
Softwaretechnologie
<<interface>>
Set
// Query methods
+ Object get(int index);
// Zustandsveränderer
+ boolean add (Object o);
<<interface>>
SortedSet
+ Object first();
+ Object last()
29
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:
class Warengruppe {
private Set inhalt;
}
►
public Warengruppe (…) {
…
this.inhalt = new TreeSet();
} …
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 …
{ … }
Softwaretechnologie
30
Anwendungsbeispiel mit TreeSet
►
Artikel muss zusätzlich von Schnittstelle Comparable erben
►
Modifikation der Klasse „Artikel“:
class Artikel implements Comparable {
...
public int compareTo (Object o) {
return name.compareTo(((Artikel)o).name);
}
}
Systemausgabe:
Warengruppe Moebel
Schrank(300) Stuhl(100) Tisch(200)
Online:
Warengruppe3.java
Softwaretechnologie
31
HashSet oder TreeSet?
►
Gemessener relativer Aufwand für Operationen auf Mengen:
(aus Eckel, Thinking in Java, 2nd ed., 2000)
Typ
HashSet
TreeSet
►
Enthalten
106,5
177,4
Iteration
39,39
40,04
Stärken von HashSet:
■
►
Einfügen
36,14
150,6
in allen Fällen schneller !
Stärken von TreeSet:
■
erlaubt Operationen für sortierte Mengen
Softwaretechnologie
32
Collection Framework (Überblick)
(Maps)
Vererbung (extends)
<<interface>>
Collection
<<interface>>
List
Implementierung (implements)
<<interface>>
Set
<<interface>>
SortedSet
<<interface>>
Map
<<interface>>
SortedMap
ArrayList
LinkedList
HashSet
HashMap
TreeSet
Softwaretechnologie
TreeMap
33
java.util.Map (Auszug)
►
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
<<interface>>
Map
// 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);
Softwaretechnologie
<<interface>>
HashMap
34
Anwendungsbeispiel
Katalog
– name: String
+ 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
1
Artikel
– name: String
– preis: int
+ preis(): int
Softwaretechnologie
35
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.java
Softwaretechnologie
36
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"); Systemausgabe:
k.put("M01",tisch);
Katalog Katalog1
k.put("M02",stuhl);
M03 -> Schrank(300)
M02 -> Stuhl(100)
k.put("M03",schrank);
M01 -> Tisch(200)
System.out.println(k);
Katalog Katalog1
k.put("M03",regal);
M03 -> Regal(200)
M02 -> Stuhl(100)
System.out.println(k);
M01 -> Tisch(200)
put(...) überschreibt vorhandenen Eintrag (Ergebnis = vorhandener Eintrag).
Ordnung auf den Schlüsseln: SortedMap (Implementierung z.B.TreeMap).
Softwaretechnologie
37
Prinzip der Hashtabelle
Effekt von hashtab.put(key,value)
►
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”
hashtab
Object
0
hashCode(): int
key: Object
key.hashCode()
value: Object
value: Object
Softwaretechnologie
capacity
38
Kollision beim Einstechen
►
Die Hashfunktion ist mehrdeutig (nicht injektiv):
■
Bei nicht eindeutigen Schlüsseln, oder auch durch die Normierung,
werden Einträge doppelt “adressiert” (Kollision)
0
key1: Object
value1: Object
key2: Object
value2: Object
key1.hashCode() value?: Object
= key2.hashCode()
Verfahren zur Kollisionsauflösung:
– Überlauflisten
– Überlauf in der Hashtabelle
Softwaretechnologie
capacity
39
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
Softwaretechnologie
Entwicklung einer
neuartigen Lösung
40
Suche nach vorgefertigten Lösungen
(Collection-Klassen der Bibliothek)
Collection
Map
Einfügen eines Elements
Entfernen eines Elements
Aufzählen aller Elemente
"ist enthalten"-Abfrage
dynamisch erweiterbar
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
Einfügereihenfolge relevant?
ja
SortedMap
nein
List
Abfrage an i-ter Position
Ersetzen an i-ter Position
Entfernen an i-ter Position
Softwaretechnologie
Sortierung der
Schlüssel relevant?
Set
Sortierung relevant?
SortedSet
kleinstes/größtes Element
Elemente "über"/"unter" x
41
Beispiel: Realisierung von Assoziationen
A
*
assoc
B
Datenstruktur im A-Objekt für B-Referenzen
Anforderung
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
Realisierung
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
Softwaretechnologie
42
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();
}
Softwaretechnologie
43
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)
Softwaretechnologie
44
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
45
Objektorientierte Implementierung
mit Java-Datenstrukturen
Persistente Datenhaltung
Art is long, and Time is fleeting.
H. W. Longfellow
Softwaretechnologie, © Prof. Uwe Aßmann, Prof. Heinrich Hussmann
46
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)
Softwaretechnologie
47
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;
}
Softwaretechnologie
48
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);
...
Softwaretechnologie
49
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();
Softwaretechnologie
50
The End
►
Diese Folien sind eine überarbeitete Version der Vorlesungsfolien zur
Vorlesung Softwaretechnologie von © Prof. H. Hussmann, 2002.
used by permission.
Softwaretechnologie
51
Herunterladen