• Keine Ergebnisse gefunden

Teil II) Objektorientierte Implementierung

N/A
N/A
Protected

Academic year: 2021

Aktie "Teil II) Objektorientierte Implementierung"

Copied!
52
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(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

(2)

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

(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

(4)

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)

(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 auf

Bestellposition Object

Spezialisierung von Object auf Bestellposition?

(6)

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.

(7)

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

(8)

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.java

mit LinkedList:

(9)

11.1 Polymorphe Container durch

Schnittstellen

(10)

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 !

!

(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 !

(12)

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) ...

}

(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

(14)

Softwaretechnologie, © Prof. Uwe Aßmann

Technische Universität Dresden, Fakultät Informatik 14

11.2 Entwurfsmuster Iterator

(15)

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..

*

(16)

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)

(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());

}

(18)

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

(19)

11.3 Auswahl von Implementierungen

von Datenstrukturen

(20)

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

(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

(22)

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)

(23)

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

(24)

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

(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

<<interface>>

HashSet

(26)

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

(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

(28)

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

(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)

(30)

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

(31)

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();

} … }

(32)

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

(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

(34)

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)

(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

(36)

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

(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.java

(38)

Prof. 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).

(39)

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”

(40)

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)

(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

(42)

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

(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

(44)

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();

}

(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)

(46)

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;

} ...

}

(47)

11.4 Persistente Datenhaltung

Art is long, and Time is fleeting.

H. W. Longfellow

(48)

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)

(49)

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;

}

(50)

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);

...

(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();

(52)

Prof. U. Aßmann, Softwaretechnologie 52

The End

Diese Folien sind eine überarbeitete Version der Vorlesungsfolien zur Vorlesung Softwaretechnologie von © Prof. H. Hussmann, 2002.

used by permission.

Referenzen

ÄHNLICHE DOKUMENTE

The boundary between science centers and museums blurs and science centers increasingly employ historic artifacts to demonstrate that science and technology have a past and are

public final class Class extends Object implements Serializable { public static Class forName(String name).

Schnittstelle java.util.Collection (Auszug) public interface Collection { // Anfragen (Queries) public boolean isEmpty(); public boolean contains (Object o); public

public interface Collection { // Anfragen (Queries) public boolean isEmpty();. public boolean contains

► Probleme werden durch das Java-Collection-Framework gelöst, eine objektorientierte Datenstrukturbibliothek für Java. ■ Meiste

Geordnete Collections II - java.util.LinkedList (Auszug) public class LinkedList implements List { public boolean add (Object o); public boolean remove (Object o); public

As in set forcing, we are interested in preserving properties of forcing notions under dense

Women, on the other hand, have been seen to take care of the household (domus) and were therefore more likely to be in the private sphere 6. According to this understanding,