2 Folien/Seite

Werbung
5. Objektorientierte Implementierung
mit Java-Datenstrukturen
5.1
5.2
5.3
5.4
Java-2 Collection Framework
Generisches Programmieren
Auswahl von Datenstrukturen
Ausnahmebehandlung in Java
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
5. Objektorientierte Implementierung
5.3 Auswahl von Datenstrukturen
T echnische Universität Dresden
Prof. Hußmann
Seite 1
Softwaretechnologie
"Alte" Datenstrukturen (aus Java 1.0)
<<interface>>
Vererbung (extends)
Collection
Implementierung (implements)
<<interface>>
<<interface>>
<<interface>>
List
Set
Map
<<interface>>
<<interface>>
SortedSet
SortedMap
ArrayList
HashSet
LinkedList
Vector
TreeSet
T echnische Universität Dresden
Prof. Hußmann
HashMap
Hashtable TreeMap
Softwaretechnologie
Welche Listen-Implementierung?
• Gemessener relativer Aufwand für Operationen auf Listen:
(aus Eckel, Thinking in Java, 2nd ed., 2000)
Typ
array
ArrayList
LinkedList
Vector
Lesen
1430
3070
16320
4890
Iteration
3850
12200
9110
16250
Einfügen
-500
110
550
Entfernen
-46850
60
46850
• 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
T echnische Universität Dresden
Prof. Hußmann
Seite 2
Softwaretechnologie
java.util.Set (Auszug)
public interface Set {
public
public
public
public
public
public
...
public
public
...
public
boolean add (Object o);
boolean remove (Object o);
void clear();
boolean isEmpty();
boolean contains (Object o);
int size();
boolean equals (Object o);
int hashCode();
Iterator iterator();
}
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
Anwendungsbeispiel für Set
Warengruppe
– name: String
– lagerplatz: String
+ add (a: Artikel)
+ anzahl(): int
1
*
Artikel
– name: String
– preis: int
+ preis(): int
T echnische Universität Dresden
Prof. Hußmann
Seite 3
Softwaretechnologie
java.util.HashSet (Auszug)
public class HashSet implements Set ... {
public HashSet
(int initialCapacity, float loadFactor);
...
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 boolean equals (Object o);
public int hashCode();
...
public Iterator iterator();
}
(Anmerkung: Erläuterung von Hashfunktionen folgt etwas später !)
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
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();
};
}
}
T echnische Universität Dresden
Prof. Hußmann
Seite 4
Softwaretechnologie
Wann sind Objekte gleich? (1)
• Vergleich mit Operation == :
– Referenzgleichheit, d.h. physische Identität der Objekte
– Typischer Fehler: Stringvergleich mit "=="
• 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 !
• Bei Verwendung von Hashfunktionen (z.B. durch HashSet):
– Operation o.hashCode() aus java.lang.Object überdefinieren
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
Wann sind Objekte gleich? (2)
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:
Warengruppe Moebel
Tisch(200) Tisch(200) Schrank(300) Stuhl(100)
T echnische Universität Dresden
Prof. Hußmann
Seite 5
Softwaretechnologie
Wann sind Objekte gleich? (3)
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)
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
Delegation vs. Vererbung
class Warengruppe { …
Delegation
private Set inhalt;
public Warengruppe (…) { …
this.inhalt = new HashSet();
}
public void add (Artikel a) { inhalt.add(a); }
…
}
class Warengruppe extends HashSet { …
Vererbung
public Warengruppe (…) {
super(); …
}
…
// keine explizite add-Operation !
}
T echnische Universität Dresden
Prof. Hußmann
Seite 6
Softwaretechnologie
java.util.SortedSet (Auszug)
public interface SortedSet extends Set {
public
public
public
public
public
public
...
public
public
public
...
public
public
boolean add (Object o);
boolean remove (Object o);
void clear();
boolean isEmpty();
boolean contains (Object o);
int size();
boolean equals (Object o);
int hashCode();
Iterator iterator();
Object first();
Object last(); ...
}
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
java.util.TreeSet
• Modifikation der Klasse Warengruppe:
class Warengruppe {
private Set inhalt;
public Warengruppe (…) {
…
this.inhalt = new TreeSet();
} …
}
• Systemreaktion:
Exception in thread "main" java.lang.ClassCastException: Artikel
at java.util.TreeMap.compare(TreeMap.java, Compiled Code)
• java.util.TreeSet:
public class TreeSet … implements SortedSet … {
… }
T echnische Universität Dresden
Prof. Hußmann
Seite 7
Softwaretechnologie
Anwendungsbeispiel mit TreeSet
• 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)
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
HashSet oder TreeSet?
• Gemessener relativer Aufwand für Operationen auf Mengen:
(aus Eckel, Thinking in Java, 2nd ed., 2000)
Typ
HashSet
TreeSet
Einfügen
36,14
150,6
Enthalten
106,5
177,4
Iteration
39,39
40,04
• Stärken von HashSet:
– in allen Fällen schneller !
• Stärken von TreeSet:
– erlaubt Operationen für sortierte Mengen
T echnische Universität Dresden
Prof. Hußmann
Seite 8
Softwaretechnologie
java.util.Map (Auszug)
public interface Map {
...
public boolean containsKey (Object key);
public boolean containsValue (Object value);
public Object get (Object key);
public Object put (Object key, Object value);
public Object remove (Object key);
public int size();
public Set keySet();
public Collection values();
...
}
„Assoziativer Speicher“
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
Anwendungsbeispiel
Katalog
– name: String
+ put (code: String, a: Artikel)
+ get (code: String): Artikel
+ anzahl(): int
code: String
*
1
Artikel
– name: String
– preis: int
+ preis(): int
T echnische Universität Dresden
Prof. Hußmann
Seite 9
Softwaretechnologie
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);
}
...
}
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
Testprogramm für Anwendungsbeispiel
public static void main (String[] args) {
Artikel
Artikel
Artikel
Artikel
tisch =
stuhl =
schrank
regal =
new Artikel("Tisch",200);
new Artikel("Stuhl",100);
= new Artikel("Schrank",300);
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);
}
•
T echnische Universität Dresden
Prof. Hußmann
Seite 10
Softwaretechnologie
Systemausgabe für Testprogramm
Katalog Katalog1
M03 -> Schrank(300)
M02 -> Stuhl(100)
M01 -> Tisch(200)
Katalog Katalog1
M03 -> Regal(200)
M02 -> Stuhl(100)
M01 -> Tisch(200)
put(...) überschreibt vorhandenen Eintrag
(liefert vorhandenen Eintrag als Ergebnis).
Eine Ordnung auf den Schlüsseln wird erst durch
SortedMap (Implementierung z.B.TreeMap)
erreicht.
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
Prinzip der Hashtabelle
hashtab
0
Object
hashCode(): int
key: Object
key.hashCode() value: Object
value: Object
Effekt von hashtab.put(key,value)
capacity
T echnische Universität Dresden
Prof. Hußmann
Seite 11
Softwaretechnologie
Kollision
0
key1: Object
value1: Object
key2: Object
key1.hashCode()
= key2.hashCode() value?: Object
value2: Object
capacity
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
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
Ggf. Experimente (experimentelle Prototypen)
Anpassung an
vorgefertigte Lösung
T echnische Universität Dresden
Entwicklung einer
neuartigen Lösung
Prof. Hußmann
Seite 12
Softwaretechnologie
Realisierung von Assoziationen mit Set
assoc
A
*
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();
}
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
Beispiel zu Set-Assoziationen (Teil 1)
Teambesprechung
*
*
teilnahme
Teammitglied
name
abteilung
import
import java.util.Set;
java.util.Set;
import
import java.util.HashSet;
java.util.HashSet;
import
import java.util.Iterator;
java.util.Iterator; ...
...
class
class Teammitglied
Teammitglied {{
private
private String
String name;
name;
private
private String
String abteilung;
abteilung;
private
private Set
Set teilnahme;
teilnahme;
public
void
public void teilnahmeSetzen
teilnahmeSetzen (Teambesprechung
(Teambesprechung b)
b) {{
teilnahme.add(b);
teilnahme.add(b);
}}
public
public Teammitglied
Teammitglied (String
(String name,
name, String
String abteilung)
abteilung) {{
this.name
this.name == name;
name;
this.abteilung
this.abteilung == abteilung;
abteilung;
this.teilnahme
this.teilnahme == new
new HashSet();
HashSet();
}} ...
...
}}
T echnische Universität Dresden
Prof. Hußmann
Seite 13
Softwaretechnologie
Beispiel zu Set-Assoziationen (Teil 2)
class Teammitglied {
...
public boolean terminBestaetigen (Date beginn,int dauer) {
boolean konflikt = false;
Iterator it = teilnahme.iterator();
while (it.hasNext() && !konflikt) {
Teambesprechung b = (Teambesprechung)it.next();
if (b.inKonflikt(beginn, dauer))
konflikt = true;
};
return !konflikt;
}
...
}
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
Suche nach vorgefertigten Lösungen
Collection
Map
Einfügen eines Elements
Entfernen eines Elements
Aufzählen aller Elemente
"ist enthalten"-Abfrage
dynamisch erweiterbar
Einfügereihenfolge relevant?
ja
Sortierung der
Schlüssel relevant?
SortedMap
nein
List
Abfrage an i-ter Position
Ersetzen an i-ter Position
Entfernen an i-ter Position
T echnische Universität Dresden
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
Set
Sortierung relevant?
SortedSet
kleinstes/größtes Element
Elemente "über"/"unter" x
Prof. Hußmann
Seite 14
Softwaretechnologie
Beispiel: Realisierung von Assoziationen
A
*
B
assoc
Datenstruktur im A-Objekt für B-Referenzen
Anforderung
Abstraktion
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
T echnische Universität Dresden
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
Prof. Hußmann
Softwaretechnologie
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)
T echnische Universität Dresden
Prof. Hußmann
Seite 15
Softwaretechnologie
Raumverwaltung: Freien Raum suchen
class Raumverwaltung {
private static SortedSet vorhandeneRaeume
= new TreeSet();
// Vorhandene Raeume, aufsteigend nach Groesse sortiert
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;
} ...
}
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
5. Objektorientierte Implementierung
5.4 Ausnahme-Behandlung
T echnische Universität Dresden
Prof. Hußmann
Seite 16
Softwaretechnologie
Ausnahmebehandlung in Java
• Ausnahme (Exception):
– Objekt einer Unterklasse von java.lang.Exception
– Vordefiniert oder und selbstdefiniert
• Ausnahme auslösen (to throw an exception)
– Erzeugen eines Exception-Objekts
– Löst Suche nach Behandlung aus
• Ausnahme abfangen und behandeln
(to catch and handle an exception)
– Aktionen zur weiteren Fortsetzung des Programms bestimmen
• Ausnahme deklarieren
– Angabe, daß eine Methode außer dem normalen Ergebnis auch eine
Ausnahme auslösen kann (Java: throws)
– Beispiel aus java.io.InputStream:
public int read() throws IOException;
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
Java-Syntax für Ausnahmebehandlung
class TotalDiv {
public static int tDiv (int x, int y) {
try {
return (x / y);
}
catch (ArithmeticException e) {
return 0;
}
}
}
T echnische Universität Dresden
Prof. Hußmann
Seite 17
Softwaretechnologie
Suche nach Ausnahmebehandlung
• Suche nach Abfangklausel (catch) entlang der (dynamischen)
Aufrufhierarchie:
main
m1
Suchreihenfolge
m2
/
• Bei mehreren Abfangklauseln an der gleichen Stelle der
Hierarchie gilt die zuerst definierte Klausel:
try { }
catch (xException e)
catch (yException e)
T echnische Universität Dresden
Suchreihenfolge
Prof. Hußmann
Softwaretechnologie
Definition neuer Ausnahmen
class TestException extends Exception {
public TestException () {
super();
}
}
class SpecialAdd {
public static int sAdd (int x, int y)
throws TestException {
if (y == 0)
throw new TestException();
else
return x + y;
}
}
Benutzung von vordefinierten Ausnahmen möglich und empfehlenswert !
T echnische Universität Dresden
Prof. Hußmann
Seite 18
Softwaretechnologie
Deklaration und Propagation von Ausnahmen
• Wer eine Methode aufruft, die eine Ausnahme auslösen kann, muß
– entweder die Ausnahme abfangen
– oder die Ausnahme weitergeben (propagieren)
• Propagation in Java: Deklarationspflicht mittels throws
(außer bei Error und RunTimeException)
public static void main (String[] argv){
System.out.println(SpecialAdd.sAdd(3,0));
}
Java-Compiler: Exception TestException must be caught,
or it must be declared in the throws clause of this method.
T echnische Universität Dresden
Prof. Hußmann
Softwaretechnologie
Regeln zum Umgang mit Ausnahmen
• Ausnahmebehandlung niemals zur Behandlung normaler (d.h.
häufig auftretender) Programmsituationen einsetzen
• Ausnahmebehandlung nicht zu komplex gestalten
• Auf keinen Fall Ausnahmen “abwürgen”, z.B. durch triviale
Ausnahmebehandlung
• Ausnahmen zu propagieren ist keine Schande, sondern erhöht die
Flexibilität des entwickelten Codes.
T echnische Universität Dresden
Prof. Hußmann
Seite 19
Softwaretechnologie
Herunterladen