5) Weitere Java-Konstrukte

Werbung
Literatur
5) Weitere Java-Konstrukte
►
Obligatorisch:
Balzert, verschiedene Abschnitte
Boles Kap. 8, 13, 14
■
■
►
►
Prof. Dr. rer. nat. Uwe Aßmann
Institut für Software- und
Multimediatechnik
Lehrstuhl Softwaretechnologie
Fakultät für Informatik
Version 11-0.1, 4/16/11
■
►
Kommunikationsdiagramme:
http://www.agilemodeling.com/essays/umlDiagrams.htm
http://www.agilemodeling.com/artifacts/communicationDiagram.htm
http://en.wikipedia.org/wiki/Communication_diagram
http://www.sparxsystems.com.au/resources/uml2_tutorial/
■
■
■
1) Konstruktoren
Softwaretechnologie, © Prof. Uwe Aßmann
Technische Universität Dresden, Fakultät Informatik
http://www.computer-books.us/java_8.php
http://www.computer-books.us/java.php
■
1) Bemerkungen zum
Selbststudium
2) Sichtbarkeiten
3) Operationen
■
4) Ausnahmen
5) super
TU Dresden
uml2_communicationdiagram.html
1
Prof. U. Aßmann, Softwaretechnologie
Über die Homepage der Lehrveranstaltung (bei "Vorlesungen")
finden Sie die Datei
Termin
Terminv.java
Diese Datei enthält eine vollständige Umsetzung des Beispiels
"Terminverwaltung" in lauffähigen Java-Code.
►
Empfohlene Benutzung:
Lesen
■
Übersetzen, Starten, Verstehen
■
Modifizieren
■
class Termin {
...
protected String titel;
protected Hour beginn;
protected int dauer;
...
};
# titel
# beginn
# dauer
►
■
2
Laufendes Beispiel Terminverwaltung
Hinweis: Online-Ressourcen!
►
The Java Language Reference Manual.
Freies Java Buch (leider nur Version 1.1, für Grundlagen):
class Teambesprechung
extends Termin {
Teambesprechung
teilnahme
Kritisieren
VeranstOrt
2..*
Teammitglied
Prof. U. Aßmann, Softwaretechnologie
3
1
private Teammitglied[] teilnahme;
private BesprRaum veranstOrt;
...
};
Bespr.raum
Prof. U. Aßmann, Softwaretechnologie
4
Java im Selbststudium
Ausdrücke <Exp>
Hinweis: Material zum Selbststudium
Die folgenden Folien enthalten Material zur JavaProgrammierung für das Selbststudium.
Das Material wird in den Übungen an verschiedenen Stellen
entfaltet
Bitte stellen Sie sicher, dass Sie diese Folieninhalte
beherrschen
►
►
►
►
►
►
►
►
►
►
►
►
►
Prof. U. Aßmann, Softwaretechnologie
5
Java im Selbststudium
Anweisungen (1) <Statement>
►
Variablendeklaration <Typ> <variable>;
Konstruktoraufruf new <ClassName> (<parameterList>)
Arrayinstanziierung new <BasisTypName> [<n>]
Konditionalausdruck <BoolExp> ? <Exp1> : <Exp2>
Cast-Ausdruck (<TypName>) <Exp>
Prof. U. Aßmann, Softwaretechnologie
6
►
mit Wertsemantik (für primitive Typen)
mit Referenzsemantik für Referenztypen (Klassen, Interfaces,
Enumerations)
Methodenaufruf mit Semikolon o.m(...);
Konstruktoraufruf mit Semikolon
►
Zuweisung <variable> = <wert>;
►
Leere Anweisung ;
Block {<StatementList> }
• if (<BoolExp>) <Statement1> else <Statement2>
• switch (<Exp>) {
case <Exp1> : <StatementList1>
...
default: <StatementList>
• while (<BoolExp>) <Statement>
• for (<InitExp>; <BoolExp>; <UpdateExp>) <Statement>
• break [<label>];
• return [<Exp>];
• try <TryBlock>
catch (<formalParam1>) <CatchBlock1>
...
finally <FinallyBlock>
■
new <ClassName> (<parameterList>);
►
Operator in Ausdruck
Attributzugriff o.a / super.a / this.a
Methodenaufruf o.m(...) / super.m(...) / this.m(...)
Array-Zugriff a[i] / a[i][j] / ...
Java im Selbststudium
Anweisungen (2) Auswahl von Kontrollstrukturen
■
►
Literal
Variable, spezielle Variable this
Prof. U. Aßmann, Softwaretechnologie
7
Prof. U. Aßmann, Softwaretechnologie
8
Verfeinerung von Klassen Datenkapselung mit Sichtbarkeit
von Merkmalen
Zugriff auf Attributwerte in Java
►
Attributwerte sind „Privatangelegenheit“ eines Objekts
(Geheimnisprinzip)
►
Acessoren (Zugriffsmethoden) sind implizite Operationen zum
Lesen und Schreiben von Attributwerten
►
►
■
Lesen („get-Methode“)
■
Setzen („set-Methode“)
Beispiel:
■
Attribut:
beginn: Date
■
Leseoperation:
getBeginn(): Date
■
Schreiboperation:
setBeginn(d: Date)
In den meisten objektorientierten Programmiersprachen (auch Java)
können Attribute syntaktisch wie Variablen angesprochen werden:
Für Objekt x : Teambesprechung :
Softwaretechnologie, © Prof. Uwe Aßmann
Technische Universität Dresden, Fakultät Informatik
9
Bezüge auf Attributwerte und Operationsaufrufe werden i.A. mit
Objekt . Name angegeben.
►
"this" bedeutet das Objekt, auf dem die Methode ausgeführt wird.
►
"this" wird vom Übersetzer automatisch ergänzt, wenn die
Objektangabe fehlt.
Attribut:
x.beginn
■
Leseoperation:
… x.beginn …
(Typ ist Date)
■
Schreiboperation:
x.beginn = …
Prof. U. Aßmann, Softwaretechnologie
Die implizit definierte Variable "This"
►
■
10
Datenkapselung und Sichtbarkeit
►
Definition Für eine Operation OP einer Klasse K wird eine
Sichtbarkeit definiert, z.B. privat (Regelfall) oder öffentlich.
■
►
Private Operation OP einer Klasse K: Die Ausführung von OP für
ein Objekt der Klasse K ist nur durch ein Objekt der selben Klasse K
möglich.
►
Öffentliche (public) Operation: Ein beliebiges Objekt darf OP
ausführen.
►
Geschützte (protected) Operation: Ein Objekt O darf OP genau dann
ausführen, wenn die Klasse von O eine Unterklasse von K ist.
►
Notation:
class Teammitglied {
private String name;
private String abteilung;
public Teammitglied (String name, String abteilung) {
this.name = name;
this.abteilung = abteilung;
}
...
};
Die Sichtbarkeit eines Attributes ist gleichbedeutend mit der Sichtbarkeit
seiner impliziten Operationen.
■
Minuszeichen (privat)
■
Pluszeichen (öffentlich)
+ Operation + Attribut
– Operation – Attribut
■
Kreuzzeichen (geschützt)
# Operation # Attribut
Teammitglied m = new Teammitglied("Max Müller", "Abt. B");
Prof. U. Aßmann, Softwaretechnologie
11
Prof. U. Aßmann, Softwaretechnologie
12
Modifikatoren (Modifier) für Deklarationen in
Java
Beispiel: Vererbung und Sichtbarkeit in jUML
►
K1
– a1
# a2
op2 kann verwenden:
a1, a2, op1, op3
– op1()
+ op2()
# op3()
K2
K3
■
op5()
op5 kann verwenden:
op2
op4 kann verwenden:
a2, op2, op3
Bsp.: public static void main(...)
►
Modifikatoren für Sichtbarkeiten: Umsetzung der UML-Sichtbarkeiten
►
Klassenattribute und -operationen: Schlüsselwort static
class C {
C
Sichtbarkeitssymbole:
–
private
+
public
#
protected
op4()
• Alle Attribute und Operationen werden als Bestandteil der Objektstruktur
vererbt.
• In der Unterklasse sichtbar sind nur öffentliche und geschützte Attribute
und Operationen.
Prof. U. Aßmann, Softwaretechnologie
– a1: T1
# a2: T2
+ a3: T3
+a4: T4
private T1 a1;
protected T2 a2;
public T3 a3;
public static T4 a4;
– op1()
# op2()
+ op3()
+op4()
private ... op1(...) {...}
protected ... op2(...) {...}
public ... op3(...) {...}
public static ... op4(...) {...}
}
13
Datenkapselung mit Sichtbarkeiten (1) Beispiel
►
Java: Vor den Deklarationen von Attributen und Operationen oft
längere Ketten von Schlüsselworten
Prof. U. Aßmann, Softwaretechnologie
14
Datenkapselung (2) - Beispiel im Detail
Private Attributen für Datenkapselung (information hiding)
■
r18: Besprechungsraum
bilden die Grundlage für die Verantwortlichkeit des Objekts
2. reservieren(neu)
3. freigeben(alt)
Besprechungsraum-Objekt
Ort
ar12: Teambesprechung
leitet
Es steht nur lokale Information
zur Verfügung:
Attributwerte, assoziierte Objekte
Teilnahme
titel = "12.Abteilungsrunde"
beginn = 10.10.00 09:00
dauer = 60
diverse
TeammitgliedObjekte
titel = "12.Abteilungsrunde"
beginn = 10.10.00 09:00
dauer = 60
tm1: Teammitglied
1.1 terminBestätigen(neu)
ar12: Teambesprechung
Teilnahme
verschieben(17.10.00 09:00)
Ort
1.2 terminBestätigen(neu)
1.3 terminBestätigen(neu)
leitet
Leitendes
Teammitglied
1. verschieben(17.10.00 09:00)
1. Alle Teammitglieder nach Konflikten
mit neuem Datum fragen
2. Besprechungsraum zum neuen Termin
reservieren
3. Alte Reservierung (Raum) freigeben
4. Datum ändern
Prof. U. Aßmann, Softwaretechnologie
tm2: Teammitglied
Anmerkung:
Darstellung= UML"Kommunikationsdiagramm"
15
tm3: Teammitglied
1. Alle Teammitglieder nach Konflikten
mit neuem Datum fragen
2. Besprechungsraum zum neuen Termin
reservieren
3. Alte Reservierung (Raum) freigeben
4. Datum ändern
Prof. U. Aßmann, Softwaretechnologie
16
Datenkapselung (3) – Wohin legt man
Operationen?
Datenkapselung (3) – Wohin legt man
Operationen?
►
Beispiel:
raumFestlegen() in Klasse Teambesprechung
■
2. Welcher Raum?
3. Reservieren.
■
►
Modularisierungsprinzip der größen Kohäsion/geringen Kopplung:
■
(diverse
TeammitgliedObjekte)
n=5
Besprechungsraum
reservieren(tb)
►
R15: Besprechungsraum
■
Notwendigkeit zur Objektinteraktion möglichst minimieren (geringe
Kopplung)
■
Möglichst Gebrauch von vorhandenen Operationen machen bzw.
Operationen mehrfach nutzen (geringe Redundanz)
Mit Sichtbarkeiten verbirgt man im Modell Geheimnisse (Parnas'
Prinzip des information hiding)
■
Prof. U. Aßmann, Softwaretechnologie
17
Mehr zur Sichtbarkeit von Klassen
■
+
public
#
protected
–
private
(default)
... auch Methoden genannt...
Sichtbar für:
Gleiche Klasse
ja
ja
ja / nein *
ja
ja
nein
ja
Andere Klasse, gleiches Paket
ja
Andere Klasse, anderes Paket
ja
nein
nein
nein
Unterklasse, gleiches Paket
ja
ja
nein
ja
Unterklasse, anderes Paket
ja
ja
nein
nein
*
Stärkere “Geheimnisse” erlauben bessere Austauschbarkeit von
Prof. U. Aßmann, Softwaretechnologie
Implementierungen, weil die Umgebung weniger Annahmen trifft
Verbesserte Wiederverwendung
Operationen
Sichtbarkeits-Symbol
UML
Java
Möglichst intensive Ausnutzung der Datenkapselung (große Kohäsion):
♦ da zuordnen, wo am besten von lokaler Information Gebrauch gemacht
werden kann
tb: Teambesprechung
R15
genehmigen():
♦ Operation von "Termin" oder von "Teammitglied"?
Teilnahme
freienRaumSuchen()
freienRaumSuchen():
♦ Operation von "Besprechungsraum" oder von "Teambesprechung"?
Teambesprechung
titel
beginn
dauer
raumFestlegen()
einladen()
absagen()
1. Wieviele Teilnehmer?
Weitere Zweifelsfälle:
In UML und C++ “nein”, in Java “ja”.
Prof. U. Aßmann, Softwaretechnologie
19
Softwaretechnologie, © Prof. Uwe Aßmann
Technische Universität Dresden, Fakultät Informatik
20
18
Klassenoperation (Statische
Operation)
►
Überladung von Operationen
Definition Eine Klassenoperation A einer Klasse K ist die
Beschreibung einer Aufgabe, die nur unter Kenntnis der aktuellen
Gesamtheit der Instanzen der Klasse ausgeführt werden kann.
Gewöhnliche Operationen heißen auch Instanzoperationen.
►
UML Notation: Unterstreichung analog zu Klassenattributen.
►
Java: Die Methode main() ist statisch, und kann vom
Betriebssystem aus aufgerufen werden
■
►
■
►
►
}
21
Prof. U. Aßmann, Softwaretechnologie
►
int f1 (int x, y) {...}
int f1 (int x) {...}
int x = f1(f1(1,2));
macht der Übersetzer
►
►
indem er die Stelligkeit und die Typen der Parameter bestimmt und den
Funktionsnamen in der .class-Datei expandiert
Polymorphie dagegen kann nicht zur Übersetzungszeit aufgelöst
werden
■
Definition: Ein Konstruktor (-operation) C einer Klasse K ist eine
Klassenoperation, die eine neue Instanz der Klasse erzeugt und
initialisiert.
■
int f1_2_int_int (int x, y) {...}
int f1_1_int (int x) {...}
int x = f1_1_int( f1_2_int_int(1,2) );
►
22
Konstruktor-Operation
Überladung wird vom Java-Übersetzer statisch aufgelöst. Aus
■
Arithmetic
raumNr
kapazität
plus(Nat, Nat):Nat
plus(Int, Int):Int
plus(Real, Real):Real
Überladen vs. Polymorphismus
■
Java-Operationen:
public static main (String[] args) {
Steuerzahler hans =
new Steuerzahler();
...
}
Prof. U. Aßmann, Softwaretechnologie
►
Klassisches Beispiel: Arithmetik
int f1 (int x, y) {...}
int f1 (int x) {...}
int x = f1(f1(1,2));
class Steuererklaerung {
reservieren()
freigeben()
freienRaumSuchen()
Auswahl aus mehreren gleichnamigen Operationen nach Anzahl und Art
der Parameter.
+: (Nat,Nat)Nat, (Int,Int)Int, (Real,Real)Real
Klassenattribute und -operationen: Schlüsselwort static
Besprechungsraum
raumNr
kapazität
Zwei Methoden heissen überladen, wenn sie gleich heissen, sich
aber in ihrer Signatur (Zahl oder Typisierung der Parameter)
unterscheiden
Ergebnistyp von C ist immer implizit die Klasse K.
Explizite Konstruktoroperationen werden in UML mit einem
Stereotyp "<<constructor>>" markiert.
Default-Konstruktor: Eine Konstruktoroperationen ohne Parameter
wird implizit für jede Klasse angenommen
Besprechungsraum
Der Merkmalssuchalgorithmus muss dynamisch laufen, da dem
Übersetzer nicht klar ist, welchen Unterklassentyp ein Objekt besitzt (es
können alle Typen unterhalb der angegebenen Klasse in Frage kommen)
raumNr
kapazität
freigeben()
freienRaumSuchen()
neuerBesprechungsraum
(raumNr, kapazität) <<constructor>>
class Teammitglied {
... // ohne Konstruktor
}
Teammitglied m = new Teammitglied();
neuerBesprechungsraum (kapazität) <<constructor>>
Prof. U. Aßmann, Softwaretechnologie
23
Prof. U. Aßmann, Softwaretechnologie
24
Mehr zu Konstruktoren in Java
►
Löschen von Objekten
►
Konstruktoren werden meist überladen:
■
class Teammitglied {
private String name;
private String abteilung;
►
public Teammitglied (String n, String abt) {
name = n;
abteilung = abt;
}
public Teammitglied (String n) {
name = n;
abteilung = "";
}
teilnahme
Sobald keine Referenz mehr auf ein Objekt besteht, kann es gelöscht
werden.
■
Der konkrete Zeitpunkt der Löschung wird vom Java-Laufzeitsystem
festgelegt ("garbage collection").
■
Aktionen, die vor dem Löschen ausgeführt werden müssen:
2..*
*
Fortgeschrittene Technik zur Objektverwaltung (z.B. für Caches):
■
"schwache" Referenzen (verhindern Freigabe nicht)
■
Paket java.lang.ref
25
Prof. U. Aßmann, Softwaretechnologie
26
Beispiel Methodenrumpf (2) – Konstruktor für
Netzaufbau
Beispiel Methodenrumpf (1)
Teambesprechung
■
protected void finalize() (über)definieren
Teammitglied m = new Teammitglied("Max Müller", "Abt. B");
Teammitglied m2 = new Teammitglied("Mandy Schmitt");
Prof. U. Aßmann, Softwaretechnologie
Andere objektorientierte Programmiersprachen kennen Destruktoren
(z.B. C++)
Speicherfreigabe in Java:
... }
►
– abstimmen()
In Java gibt es keine Operation zum Löschen von Objekten
(keine "Destruktoren").
Teammitglied
Teambesprechung
+terminBestaetigen()
– abstimmen()
<<constructor>>
Teambesprechung(titel,
beginn, dauer, teilnehmer)
teilnahme
*
2..*
Teammitglied
+terminBestaetigen()
<<constructor>>
Teambesprechung(titel,
beginn, dauer, teilnehmer)
class Teambesprechung {
private Teammitglied[] teilnahme; ...
private boolean abstimmen (Hour beginn, int dauer) ...
class Teambesprechung {
private Teammitglied[] teilnahme; ...
}
public Teambesprechung (String titel,
Hour beginn, int dauer, Teammitglied[] teilnehmer) {
// ... titel, beginn, dauer lokal speichern
this.teilnahme = teilnehmer;
if (! abstimmen(beginn, dauer))
System.out.println("Termin bitte verschieben!");
else ...
} ...
private boolean abstimmen (Hour beginn, int dauer) {
boolean ok = true;
for (int i=0; i<teilnahme.length; i++)
ok = ok &&
teilnahme[i].terminBestaetigen(beginn, dauer);
return ok;
}
}
Prof. U. Aßmann, Softwaretechnologie
27
Prof. U. Aßmann, Softwaretechnologie
28
Beispiel Methodenrumpf (3) – öffentl. Methode
Teambesprechung
– abstimmen()
teilnahme
2..*
*
Beispiel Netzaufbau im Java-Programm
Teammitglied
►
+terminBestaetigen()
Ein Programm auf höherer Ebene muss zunächst ein Objektnetz
verdrahten, bevor die Objekte kommunizieren können (Aufbauphase).
Dies kann das Hauptprogramm sein
<<constructor>>
Teambesprechung(titel,
beginn, dauer, teilnehmer)
class Terminv {
class Terminv {
public static void main (String argv[]) {
public static void main (String argv[]) {
// Aufbauphase
// Aufbauphase
Besprechungsraum r1 = new Besprechungsraum("R1", 10);
Besprechungsraum r1 = new Besprechungsraum("R1", 10);
Besprechungsraum r2 = new Besprechungsraum("R2", 20);
Besprechungsraum r2 = new Besprechungsraum("R2", 20);
Teammitglied mm = new Teammitglied("M. Mueller", "Abt. A");
Teammitglied mm = new Teammitglied("M. Mueller", "Abt. A");
Teammitglied es = new Teammitglied("E. Schmidt", "Abt. B");
Teammitglied es = new Teammitglied("E. Schmidt", "Abt. B");
Teammitglied fm = new Teammitglied("F. Maier", "Abt. B");
Teammitglied fm = new Teammitglied("F. Maier", "Abt. B");
Teammitglied hb = new Teammitglied("H. Bauer", "Abt. A");
Teammitglied hb = new Teammitglied("H. Bauer", "Abt. A");
Hour t1s5 = new Hour(1,5); // Tag 1, Stunde 5
Hour t1s5 = new Hour(1,5); // Tag 1, Stunde 5
Teammitglied[] tlB1 = {mm, es};
Teammitglied[] tlB1 = {mm, es};
Teambesprechung tb1 =
Teambesprechung tb1 =
new Teambesprechung("Bespr. 1", t1s5, 2, tlB1);
new Teambesprechung("Bespr. 1", t1s5, 2, tlB1);
class Teammitglied { ...
private Teambesprechung[] teilnahme;
public boolean terminBestaetigen (Hour beginn,int dauer){
boolean konflikt = false;
int i = 0;
while (i < teilnahme.length && !konflikt) {
if (teilnahme[i].inKonflikt(beginn, dauer))
konflikt = true;
else
i++;
};
return !konflikt;
} ...
}
}
}
Prof. U. Aßmann, Softwaretechnologie
// jetzt erst Arbeitsphase
// jetzt erst Arbeitsphase
tb1.raumFestlegen();
tb1.raumFestlegen();
...
...
}
}
29
Prof. U. Aßmann, Softwaretechnologie
30
Ausnahmebehandlung in Java
Ausnahmen (Exceptions)
►
►
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
■
abfangen und behandeln (to catch and handle an exception)
■
deklarieren
♦ Aktionen zur weiteren Fortsetzung des Programms bestimmen
♦ 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;
Softwaretechnologie, © Prof. Uwe Aßmann
Technische Universität Dresden, Fakultät Informatik
31
Prof. U. Aßmann, Softwaretechnologie
32
Dynamische Suche nach
Ausnahmebehandlung
Java-Syntax für Ausnahmebehandlung
Schnittstelle
►
class TotalDiv {
public static int tDiv (int x, int y)
throws ArithmeticException {
Gekapselter
try {
Block
return (x / y);
}
catch (ArithmeticException e) {
System.err.println(„Division by zero“);
throw new ArithmeticException();
}
}
Ausnahme}
Fänger
Prof. U. Aßmann, Softwaretechnologie
Suche nach Abfangklausel (catch) entlang der (dynamischen)
Aufrufhierarchie:
main
m1
m2
Suchreihenfolge
/
• Bei mehreren Abfangklauseln an der gleichen Stelle der Hierarchie gilt
die zuerst defi nierte Klausel:
try { }
catch (xException e)
catch (yException e)
Suchreihenfolge
33
Definition neuer Ausnahmen
Prof. U. Aßmann, Softwaretechnologie
34
Deklaration und Propagation von Ausnahmen
►
Benutzung von benutzerdefinierten Ausnahmen möglich und
empfehlenswert !
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;
}
}
Prof. U. Aßmann, Softwaretechnologie
►
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.
35
Prof. U. Aßmann, Softwaretechnologie
36
Bruch von Verträgen und Ausnahmen
►
Regeln zum Umgang mit Ausnahmen
Man kann Verträge auch mit Ausnahmetests prüfen:
►
class ContractViolation {..};
class ParameterContractViolation extends ContractViolation {..};
class FigureEditor{
draw (Figure figure) throws ContractViolation {
if (figure == null) throw new ParameterContractViolation();
}}
►
■
■
►
im Aufrufer:
►
■
►
Prof. U. Aßmann, Softwaretechnologie
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.
Gesetz 33 Verhindern Sie das Unmögliche mit Zusicherungen
■
37
Nur die richtige Dosierung des Einsatzes von Ausnahmen ist gut lesbar
Gesetz 35: Führen Sie zu Ende, was Sie begonnen haben
■
Vorteil: kontrollierte Reaktion auf Vertragsbrüche.
Ausnahmebehandlung niemals zur Behandlung normaler (d.h. häufig
auftretender) Programmsituationen einsetzen
Ausnahmen sind Ausnahmen, regulärer Code behandelt die regulären
Fälle!
Gesetz 34: Verwenden Sie Ausnahmen nur ausnahmsweise
■
try {
editor.draw(fig);
} catch (ParameterContractViolation) {
fig = new Figure();
editor.draw(fig);
}
►
Gesetz des pragmatischen Programmierers 58: Bauen Sie die
Dokumentation ein
Vertragsüberprüfungen, generieren Ausnahmen
Prof. U. Aßmann, Softwaretechnologie
Wiederholung: Dynamische Suchalgorithmen in
der JVM
►
■
■
►
Feinheiten der Vererbung
Merkmalssuchalgorithmus
Die JVM sucht dynamisch nach Methoden und Attributen entlang der
Vererbungshierarchie. Diese ist im .class-Datei abgespeichert und wird
darin abgesucht
Verwendung für Polymorphie und Reflektion
Ausnahmenbehandlersuche
■
Die JVM sucht dynamisch den Aufrufkeller nach oben ab, ob zur
ausgelösten Ausnahme ein Behandler definiert
Prof. U. Aßmann, Softwaretechnologie
39
Softwaretechnologie, © Prof. Uwe Aßmann
Technische Universität Dresden, Fakultät Informatik
40
38
Aufruf von Oberklassen-Konstruktoren durch
super-Konstruktoraufruf
Vererbung und Assoziation zusammen
►
Termin
class Termin {
...
protected String titel;
protected Hour beginn;
protected int dauer;
...
};
# titel
# beginn
# dauer
class Termin {
protected String titel;
protected Hour beginn;
protected int dauer;
...
public Termin
(String t, Hour b, Dauer d) {
titel = t; beginn = b; dauer = d; };
};
class Teambesprechung
extends Termin {
Teambesprechung
private Teammitglied[] teilnahme;
private BesprRaum veranstOrt;
...
teilnahme
VeranstOrt
2..*
Teammitglied
►
1
Bespr.raum
41
verschieben(neu: Date):Boolean
Teambesprechung
42
Was haben wir gelernt?
"super" in überschriebenen Operationen
Termin
...
Spezielle Syntax
für Konstruktoren:
"super" immer als
erste Anweisung!
class Teambesprechung extends Termin {
...
private Teammitglied[] teilnahme;
...
public Teambesprechung (String t, Hour b, Dauer d,
Teammitglied[] tn) {
super(t, b, d);
teilnahme = tn; ... };
};
Prof. U. Aßmann, Softwaretechnologie
};
Prof. U. Aßmann, Softwaretechnologie
"super" ermöglicht Aufruf von Methoden, die in der Oberklasse
definiert und überschattet sind.
Ein Super-Konstruktoraufruf ruft den Konstruktor der Oberklasse auf
und kann damit alle Aktionen dessen übernehmen
class Termin {
►
boolean verschieben
(neu: Date) {
...z.B. Aufzeichnung
in Log-datei
}
...
}
►
►
►
►
verschieben(neu: Date):Boolean
Kapselung und Modularisierung werden mit Sichtbarkeiten möglich
Spezielle Variablen (this, super) erlauben den Zugriff auf Attribute und
überschriebene Methoden/Operationen
Ausnahmen für Ausnahmen
Kommunikationsdiagramme ordnen die Methodenaufrufe über der
Fläche an und zeigen die Zeit durch Nummerierung an
Klassenoperationen von Objektoperationen unterscheiden
class Teambesprechung
extends Termin
"super"
ermöglicht auch den Zugriff auf
überschriebene Versionen von
Operationen, wie sie in einer
Oberklasse definiert sind.
Andere Syntax als bei Konstruktoren!
boolean verschieben
(neu: Date) {
...
super.verschieben(neu)
}
...
}
Prof. U. Aßmann, Softwaretechnologie
43
Prof. U. Aßmann, Softwaretechnologie
44
Herunterladen