• Keine Ergebnisse gefunden

10 Verfeinern von Assoziationen mit dem Java-2 Collection Framework 11 Programmieren gegen Schnittstellen

N/A
N/A
Protected

Academic year: 2021

Aktie "10 Verfeinern von Assoziationen mit dem Java-2 Collection Framework 11 Programmieren gegen Schnittstellen"

Copied!
13
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

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)

(2)

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

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:

(3)

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

}

(4)

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)

(5)

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

(6)

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

(7)

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

(8)

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

Comparable

erben

Modifikation der Klasse „Artikel“:

Systemausgabe:

Warengruppe Moebel

Schrank(300) Stuhl(100) Tisch(200)

Online:

Warengruppe3.java

(9)

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

(10)

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

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

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)

(11)

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

}

(12)

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)

(13)

Prof. U. Aßmann, Softwaretechnologie 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;

}

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

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

used by permission.

Referenzen

ÄHNLICHE DOKUMENTE

Das Neujahrskon- zert in Zusammenarbeit mit der Stadt Königstein und gefördert von der Taunus Sparkasse, ist seit einigen Jahren ein Publi- kumsmagnet nicht nur für

Für dieses Jahr wünsche ich uns allen Gesundheit, gute Geschäfte und bald wieder viele sorgenfreie Kontakte mit Freunden und der Familie.. Für DIE PTA IN DER APOTHEKE wird es

■ Zweite Normalform erreichen durch Elimination der rechten Seite der partiellen Abhängigkeit und Kopie der linken Seite (siehe nächste Folie). VL Datenbanken I

Aus „sozialer“ wird „emo- tionale“ Intelligenz Damals stellten Edward Lee Thorn- dike und David Wechsler, zwei US-amerikanische Psycholo- gen, eine These auf: Selbst der

Die digitale Schließanlage der TU Graz bietet die Möglichkeit, Bediensteten und Studierenden sehr flexibel Zutritt zu Gebäuden und einzelnen räumen zu geben. Nach mehreren Jahren

Diese unter ESPRIT ge- förderten Projekte waren aber nur der Beginn der ESSI-Initiative (European System and Soft- ware Initiative), deren Ziel es ist, den Bedarfan neuen Methoden

Im Europäischen Parlament gehöre ich als Mitglied dem Aus- schuss für Beschäftigung und so- ziale Angelegenheiten (EMPL) so- wie als stellvertretendes Mitglied dem Ausschuss

Im Seminar geht es um Selbstverantwor- tung, verbale und nonverbale Kom- munikation, Respekt und Wertschät- zung für die eigene Person, die Kollegen und Patienten – genau