15
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 "Der Aufrufer programmiert gegen die Schnittstelle, er befindet sich sozusagen im luftleeren Raum." Siedersleben/Denert, Wie baut man Informationssysteme, Informatik-Spektrum, August 2000 22) Programmieren gegen Schnittstellen 1 Polymorphe Container durch Schnittstellen 2 Entwurfsmuster Iterator (Stream) 3 Auswahl von Implementierungen für Datenstrukturen 4 Persistente Datenhaltung Version 12-0.3, 13.04.12 P r o f . U . A ß m a n n , S o f t w a r e t e c h n o l o g i e , T U D r e s d e n 2 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 P r o f . U . A ß m a n n , S o f t w a r e t e c h n o l o g i e , T U D r e s d e n 3 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) P r o f . U . A ß m a n n , S o f t w a r e t e c h n o l o g i e , T U D r e s d e n 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 def i niert auf Bestellposition Object Spezialisierung von Object auf Bestellposition?

3 $ #2 ( 4)st.inf.tu-dresden.de/files/teaching/ss12/swt/Vorlesungen/22-st...6 #$ $ ' #$ Bestellung kunde: String anzahl: int liste java.util.ArrayList add(Object o) get(pos: int):

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 3 $ #2 ( 4)st.inf.tu-dresden.de/files/teaching/ss12/swt/Vorlesungen/22-st...6 #$ $ ' #$ Bestellung kunde: String anzahl: int liste java.util.ArrayList add(Object o) get(pos: int):

Softwaretechnologie, © Prof. Uwe AßmannTechnische 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

"Der Aufrufer programmiert gegen die Schnittstelle,er befindet sich sozusagen im luftleeren Raum."

Siedersleben/Denert,Wie baut man Informationssysteme,Informatik-Spektrum, August 2000

22) Programmieren gegen Schnittstellen

► 1 Polymorphe Container durch Schnittstellen► 2 Entwurfsmuster Iterator (Stream)► 3 Auswahl von Implementierungen für

Datenstrukturen► 4 Persistente Datenhaltung

► Version 12-0.3, 13.04.12

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

2

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

PriorityQueueVector

Stack

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

3

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)

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

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 defi niert auf

BestellpositionObject

Spezialisierung von Object auf Bestellposition?

Page 2: 3 $ #2 ( 4)st.inf.tu-dresden.de/files/teaching/ss12/swt/Vorlesungen/22-st...6 #$ $ ' #$ Bestellung kunde: String anzahl: int liste java.util.ArrayList add(Object o) get(pos: int):

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

5

Typanpassungen auf Elementtypen

Bestellung– kunde: String

– anzahl: int liste

java.util.ArrayListadd(Object o)

get(pos: int): Object...

1Object

*

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.

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

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

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

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

Online:Bestellung3.java

Anwendungsbeispielmit LinkedList:

Softwaretechnologie, © Prof. Uwe AßmannTechnische Universität Dresden, Fakultät Informatik 8

22.1 Polymorphe Container durch Schnittstellen

Page 3: 3 $ #2 ( 4)st.inf.tu-dresden.de/files/teaching/ss12/swt/Vorlesungen/22-st...6 #$ $ ' #$ Bestellung kunde: String anzahl: int liste java.util.ArrayList add(Object o) get(pos: int):

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

9

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 !

!

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

10

• 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ß beiWechsel derDatenstrukturnur an einerStelle (Konstruktor)geändert werden !

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

11

Standardalgorithmen in der Algorithmenklasse java.util.Collections

► Algorithmenklassen (Hilfsklassen) 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)

...

} Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

12

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

Page 4: 3 $ #2 ( 4)st.inf.tu-dresden.de/files/teaching/ss12/swt/Vorlesungen/22-st...6 #$ $ ' #$ Bestellung kunde: String anzahl: int liste java.util.ArrayList add(Object o) get(pos: int):

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

13

Schnittstellen und Klassen (Erweiterung)

Schnittstelle(interface)

Abstrakte Klasse(Konkrete) Klasse

Klassenbegriff

Prädikat-Schnittstelle Algorithmenklasse

Softwaretechnologie, © Prof. Uwe AßmannTechnische Universität Dresden, Fakultät Informatik 14

22.2 Entwurfsmuster Iterator (Stream)

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

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) mit Hilfe einer Iteratormethode

– Keine Aussage über die Reihenfolge!

► Lösung:

elements(): Iterator

Container

Element

next()hasNext()

Iterator

ConcreteIterator

{abstract}

<<create>>

pull..

*

Iterator-Methode

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

16

Iterator-Beispiel in der JDK (ArrayList)

1Bestellung– 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()

ConcreteIterator

Aggregate

Element

Iterator

Klassenname nicht bekannt, weil privat

(z.B. ArrayListIterator)

Page 5: 3 $ #2 ( 4)st.inf.tu-dresden.de/files/teaching/ss12/swt/Vorlesungen/22-st...6 #$ $ ' #$ Bestellung kunde: String anzahl: int liste java.util.ArrayList add(Object o) get(pos: int):

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

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

► Vorteile:– Iteratoren und Iteratormethoden erlauben, die Netz-Struktur einer

komplexten Datenstruktur nach außen hin zu verbergen (Geheimnisprinzip)

– Sie erlauben bedarfsgesteuerte Berechnungen (processing on demand, lazy processing), weil sie nicht alle Objekte der komplexen Datenstruktur herausgeben, sondern nur die, die wirklich benötigt werden

– Iteratoren können “unendliche” Datenstrukturen repräsentieren, z.B. die natürlichen Zahlen

► Verwendungsbeispiel:

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

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

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

19

Iterator-Implementierungsmuster in modernen Sprachen

class bigObject { private List subObjects; public iterator Object deliverThem() { while (i in subObjects) {

yield i; } }}

class bigObject { private List subObjects; public iterator Object deliverThem() { while (i in subObjects) {

yield i; } }}

► In vielen Programmiersprachen (Sather, Scala) stehen Iteratormethoden (stream methods) als spezielle Prozeduren zur Verfügung, die die Unterobjekte eines Objekts liefern können

– Die yield-Anweisung gibt aus der Prozedur die Elemente zurück– Iterator-Prozedur kann mehrfach aufgerufen werden– Beim letzten Mal liefert sie null

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

20

For-Schleifen auf Iterable-Prädikatschnittstellen

class BillItem { int price; } class Bill { int sum = 0; private List billItems; public void sumUp() { for (BillItem item: billItems) { sum += item.price; } return sum; }}

class BillItem { int price; } class Bill { int sum = 0; private List billItems; public void sumUp() { for (BillItem item: billItems) { sum += item.price; } return sum; }}

► Erbt eine Klasse von Iterable, kann sie in einer vereinfachten for-Schleife benutzt werden

class BillItem { int price; } class Bill { int sum = 0; private List billItems; public void sumUp() { for (Iterator i = billItems.iterator(); i.hasNext(); ) { item = i.next(); sum += item.price; } return sum; }}

class BillItem { int price; } class Bill { int sum = 0; private List billItems; public void sumUp() { for (Iterator i = billItems.iterator(); i.hasNext(); ) { item = i.next(); sum += item.price; } return sum; }}

Page 6: 3 $ #2 ( 4)st.inf.tu-dresden.de/files/teaching/ss12/swt/Vorlesungen/22-st...6 #$ $ ' #$ Bestellung kunde: String anzahl: int liste java.util.ArrayList add(Object o) get(pos: int):

Softwaretechnologie, © Prof. Uwe AßmannTechnische Universität Dresden, Fakultät Informatik 21

22.2.2 Senken (Sinks)

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

22

Entwurfsmuster Senke (Implementierungsmuster)► Name: Senke (auch: Ablage, sink, belt)

► Problem: Ablage eines beliebig großen Datenstromes.– push– ggf. mit Abfrage, ob noch freier Platz in der Ablage

vorhanden

► Lösung:

Client

push()hasFreeSpace()

Sink

ConcreteSink

{abstract}push..

Sink-Methode

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

23

Erweiterung: Begriffshierarchie der Methodenarten

ZustandsinvarianteMethoden

ZustandsveränderndeMethoden

Anfrage (query) CheckerZustands-modifikatoren

Netz-modifikatoren

Methode

Repräsentations-Wechsler

AllgemeineMethoden

Tester

ModifikatorenIteratormethoden

SenkenSoftwaretechnologie, © Prof. Uwe Aßmann

Technische Universität Dresden, Fakultät Informatik 24

22.2.3 Channels (Pipes)

Page 7: 3 $ #2 ( 4)st.inf.tu-dresden.de/files/teaching/ss12/swt/Vorlesungen/22-st...6 #$ $ ' #$ Bestellung kunde: String anzahl: int liste java.util.ArrayList add(Object o) get(pos: int):

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

25

Entwurfsmuster Channel (Pipe) (Implementierungsmuster)► Name: Channel (auch: pipe, buffer, Kanal)

► Zweck: asynchrone Kommunikation zwischen zwei Komponenten durch Pufferung eines beliebig großen Datenstromes mit Hilfe eines Puffers buffer

– Kombination von push- und pull-Methoden (Strom- und Ablagemethoden)– ggf. mit Abfrage, ob noch freier Platz in der Ablage vorhanden– ggf. mit Abfrage, ob noch Daten im Kanal vorhanden

Client

push()hasFreeSpace()

Channel

ConcreteChannel

push ofsink..

next()hasNext()

pull of stream..

- buffer

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

26

Channels in anderen Sprachen

► Channels (pipes) kommen in vielen Sprachen als Konstrukte vor■ Shell-Skripte (Operator für pipes: “|”)■ Communicating Sequential Processes (CSP, Hoare):

♦ Operator für push: “?”

♦ Operator für pull: “!”

■ Architectural Description Languages (ADL, Kurs CBSE)

► Sie sind ein elementares Muster für die Kommunikation von parallelen Prozessen (producer-consumer-Muster)

Softwaretechnologie, © Prof. Uwe AßmannTechnische Universität Dresden, Fakultät Informatik 27

22.3 Auswahl von Implementierungenvon Datenstrukturen

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

28

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

Page 8: 3 $ #2 ( 4)st.inf.tu-dresden.de/files/teaching/ss12/swt/Vorlesungen/22-st...6 #$ $ ' #$ Bestellung kunde: String anzahl: int liste java.util.ArrayList add(Object o) get(pos: int):

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

29

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

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

30

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)

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

31

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

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

32

Anwendungsbeispiel für Set

Artikel– name: String

– preis: int

+ preis(): int

Warengruppe– name: String

– lagerplatz: String

*

1

+ add (a: Artikel)+ anzahl(): int

Page 9: 3 $ #2 ( 4)st.inf.tu-dresden.de/files/teaching/ss12/swt/Vorlesungen/22-st...6 #$ $ ' #$ Bestellung kunde: String anzahl: int liste java.util.ArrayList add(Object o) get(pos: int):

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

33

java.util.HashSet (Auszug)

(Anmerkung: Erläuterung von Hashfunktionenfolgt etwas später !)

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

// Konstruktor# HashSet(int initialCapacity,float loadFactor);+ Object get(int index);+ int hashCode()

// Zustandsveränderer+ boolean add (Object o);

<<interface>>HashSet

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

34

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

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

35

Duplikatsprüfung für Elemente in Mengen: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

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

36

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 MoebelTisch(200) Tisch(200) Schrank(300) Stuhl(100)

Online:Warengruppe0.java

Page 10: 3 $ #2 ( 4)st.inf.tu-dresden.de/files/teaching/ss12/swt/Vorlesungen/22-st...6 #$ $ ' #$ Bestellung kunde: String anzahl: int liste java.util.ArrayList add(Object o) get(pos: int):

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

37

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 MoebelSchrank(300) Tisch(200) Stuhl(100)

Es wurde zweifach dasselbe Tisch-Objekt übergeben ! (Gleiches Verhalten bei Strukturgleichheit, s. Warengruppe1.java) P

rof.

U. A

ßm

an

n, S

oftw

are

tech

nol

og

i e, T

U D

resd

e n

38

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

+ Object first();+ Object last()

<<interface>>SortedSet

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

39

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

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

40

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 MoebelSchrank(300) Stuhl(100) Tisch(200)

Online:Warengruppe3.java

Page 11: 3 $ #2 ( 4)st.inf.tu-dresden.de/files/teaching/ss12/swt/Vorlesungen/22-st...6 #$ $ ' #$ Bestellung kunde: String anzahl: int liste java.util.ArrayList add(Object o) get(pos: int):

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

41

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

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

42

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)

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

43

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

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

44

Anwendungsbeispiel: Verfeinerung von qualifizierten Relationen

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 einesehr günstige Umsetzungfür qualifizierte Assoziationen:Der Qualifikator bildet den Schlüssel;die Zielobjeke den WertHier:•Schlüssel: code:String•Wert: a:Artikel

Page 12: 3 $ #2 ( 4)st.inf.tu-dresden.de/files/teaching/ss12/swt/Vorlesungen/22-st...6 #$ $ ' #$ Bestellung kunde: String anzahl: int liste java.util.ArrayList add(Object o) get(pos: int):

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

45

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

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

46

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

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

47

value: Object

Prinzip der HashtabelleEffekt 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”

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

48

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)

Page 13: 3 $ #2 ( 4)st.inf.tu-dresden.de/files/teaching/ss12/swt/Vorlesungen/22-st...6 #$ $ ' #$ Bestellung kunde: String anzahl: int liste java.util.ArrayList add(Object o) get(pos: int):

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

49

Vorgehensweise beim Datenstruktur-Entwurf

Identifikation der Anforderungen an die Datenstruktur:Funktionalität, häufig benutzte Operationen

Abstraktion auf die wesentlichen Eigenschaften

Suche nach vorgefertigten Lösungen (Nutzung der Collection-Bibliothek)

Ggf. Experimente (experimentelle Prototypen)

Anpassung anvorgefertigte Lösung

Entwicklung einerneuartigen Lösung

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

50

Suche nach vorgefertigten Lösungen (Collection-Klassen der Bibliothek)

Einfügen eines ElementsEntfernen eines ElementsAufzählen aller Elemente

"ist enthalten"-Abfragedynamisch 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

janein

Set

kleinstes/größtes Element

Elemente "über"/"unter" x

SortedSet

Sortierung relevant?

Sortierung der Schlüssel relevant?

SortedMap

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

51

Beispiel: Realisierung von Assoziationen

A B*

assoc

Anforderung Realisierung

1) Assoziation anlegen2) Assoziation entfernen3) Durchlaufen aller bestehenden

Assoziationen zu B-Objekten4) Manchmal: Abfrage, ob

Assoziation zu einem B-Objekt besteht

5) Keine Obergrenze derMultiplizitä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 Elementeunbekannt;dynamisch erweiterbar

Set

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

52

Realisierung von ungeordneten Assoziationen mit Set

A Bassoc

*

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

Page 14: 3 $ #2 ( 4)st.inf.tu-dresden.de/files/teaching/ss12/swt/Vorlesungen/22-st...6 #$ $ ' #$ Bestellung kunde: String anzahl: int liste java.util.ArrayList add(Object o) get(pos: int):

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

53

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)

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

54

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ßmannTechnische Universität Dresden, Fakultät Informatik 55

22.4 Persistente Datenhaltung(Files als Channels)

Art is long, and Time is fleeting.H. W. Longfellow

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

56

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.

– Einsatz eines Datenbank-Systems● Objektorientiertes Datenbank-System

● Relationales Datenbank-SystemJava: Java Data Base Connectivity (JDBC)

● Zugriffsschicht auf DatenhaltungJava: Java Data Objects (JDO)

– Speicherung von Objektstrukturen in Dateien mit Senken und Iteratoren● Objekt-Serialisierung (Object Serialization)

● Die Dateien werden als Channels benutzt:

● Zuerst schreiben in eine Sink

● Dann lesen mit Iterator

Page 15: 3 $ #2 ( 4)st.inf.tu-dresden.de/files/teaching/ss12/swt/Vorlesungen/22-st...6 #$ $ ' #$ Bestellung kunde: String anzahl: int liste java.util.ArrayList add(Object o) get(pos: int):

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

57

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.

■ Ein OutputStream entspricht dem Entwurfsmuster Sink■ Ein InputStream entspricht dem Entwurfsmuster Iterator

► Eine Klasse, die Serialisierung zulassen will, muß die (leere!) Prädikat-Schnittstelle java.io.Serializable implementieren.

class ObjectOutputStream { public ObjectOutputStream (OutputStream out)

throws IOException;// push Method public void writeObject (Object obj)

throws IOException;}

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

58

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

// internally realized as push for all child objectsos.writeObject(xobj);...

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

59

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);// internally realised as pullxobj = (XClass) os.readObject();

Pro

f. U

. Aß

ma

nn,

Sof

twa

rete

chn

olo

gi e

, TU

Dre

sde n

60

The End

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