Universität Stuttgart Institut für Automatisierungstechnik und Softwaresysteme Prof. Dr.-Ing. M. Weyrich Theorie zu Übung 8 Implementierung in Java Klasse in Java Die Klasse wird durch das class-konzept realisiert Keine Trennung von Spezifikation und Implementierung der Klasse Klasse ist (abstrakter) Datentyp class Zaehler{ int Zaehlerstand; void inkrementieren() {... void initialisieren() {... int getzaehlerstand() {... Objekt in Java Klassen werden wie Datentypen verwendet Objekte können nur dynamisch erzeugt werden Zaehler einzaehler; //Objektvariable einzaehler = new Zaehler(); //einzaehler verweist auf neues //Objekt der Klasse Zaehler einzaehler = null; //Referenz auf Objekt löschen, //keine Speicherfreigabe erforderlich Abstrakte Klasse in Java Kennzeichnung mit abstract Sobald eine Klasse eine abstrakte Operation besitzt muss sie als abstract deklariert werden
Grundlagen der Softwaretechnik Übung 8: Implementierung in Java 52 abstract class Abstract1{ public void operation1() {... public void operation2() {... abstract class Abstract2{ public abstract void operation1();... Attribute und Operationen in Java Sichtbarkeit: public sichtbar für alle protected im selben Paket für alle sichtbar, außerhalb nur für Unterklassen sichtbar private sichtbar innerhalb der Klasse Voreinstellung: im Paket für alle sichtbar, außerhalb unsichtbar für alle Parameterkonzept bei Operationen in Java: Primitive Typen: call by value, Ausgabe erfolgt nur über den Ergebnistyp Objekttypen: call by reference Konstruktoren in Java: Dienen zur Initialisierung von Objekten Mehrere Konstruktoren pro Klasse möglich o Unterschiedliche Parameterlisten => overloading Keine Destruktoren in Java o Speicherplatz-Freigabe durch garbage collector
Grundlagen der Softwaretechnik Übung 8: Implementierung in Java 53 class Kreis { protected Punkt Mittelpunkt = new Punkt(1,1); //Initialisierung protected int Radius; protected static int Anzahl; //Klassenattribut public Kreis(){ //Konstruktor 1 public Kreis (int x, int y){ //Konstruktor 2 Mittelpunkt.setX(x); Mittelpunkt.setY(y); public void zeichnen() {... public static int getanzahl() {... //Klassenoperation Schnittstelle in Java Kann Konstanten und abstrakte Operationen enthalten Wird mit dem Schlüsselwort interface deklariert Wird von Klassen mit dem Schlüsselwort implements realisiert interface ClassInfo { public abstract String getclassname(); class MyClass implements ClassInfo{ public String getclassname(){ return "MyClass";...
Grundlagen der Softwaretechnik Übung 8: Implementierung in Java 54 Beispiel: public class VersicherungGUI { Versicherung eineversicherung; public void init() { // Es wird die Implementierung der // Klasse Lebensversicherung verwendet eineversicherung = new Lebensversicherung();... public void ermittlepraemie() { double VSumme =...; double Praemie = eineversicherung.berechnepraemie(vsumme);... public interface Versicherung { //abstrakte Operation public abstract double berechnepraemie (double VSumme); VersicherungGUI init() ermittlepraemie() Aufruf «interface» Versicherung berechnepraemie (double VSumme) Lebensversicherung berechnepraemie (double VSumme) berechnesonderpraemie(double VSumme) Unfallversicherung berechnepraemie (double VSumme) class Lebensversicherung implements Versicherung { //Impl. der (abstrakten) Operation mit switch public double berechnepraemie(double VSumme) { double praemie = 0.0; int Schalter = (int)((vsumme-1.0/100.0) / 5000.0); switch (Schalter) { case 0: praemie = VSumme * 16.8 / 1000.0; break; case 1: praemie = VSumme * 12.6 / 1000.0; break; default:...; break; return praemie; Assoziationen in Java Abhängig von: Obergrenzen der Kardinalitäten (maximal 1 oder größer 1) Navigierbarkeit (unidirektional oder bidirektional) class Unfallversicherung implements Versicherung { // Impl. der (abstrakten) Operation mit if public double berechnepraemie(double VSumme) { double praemie = 0.0; if(vsumme > 10000.0) praemie = VSumme * 8.4 / 1000.0; else if (VSumme <= 5000.0) praemie = VSumme * 16.8 / 1000.0; else praemie = VSumme * 12.6 / 1000.0; return praemie; Beispiel: Verwaltung einer unidirektionalen Assoziation mit Kardinalität <= 1
Grundlagen der Softwaretechnik Übung 8: Implementierung in Java 55 KlasseA einerolleb: KlasseB setrolleb(klasseb einobjektb) getrolleb() : KlasseB removerolleb() 0..1 RolleB KlasseB class KlasseA { KlasseB einerolleb; //Referenz-Attribut //Verwaltungsoperationen public void setrolleb(klasseb einobjektb) { einerolleb = einobjektb; public KlasseB getrolleb() {return einerolleb public removerolleb() {einerolleb = null Bei bidirektionalen Assoziationen Verwaltung in beiden Klassen erforderlich! Beispiel: Verwaltung einer unidirektionalen Assoziation mit Kardinalität >1 Verwendung der Java-Containerklasse Vector mit Operationen z.b. addelement(), removeelement() und elementat() Abteilung class Abteilung { protected Vector Mitarbeiter; * Mitarbeiter Angestellter public void setmitarbeiter (Angestellter ang){ Mitarbeiter.addElement (ang); Angestellter getmitarbeiter (int pos) { ang =(Angestellter)Mitarbeiter.elementAt(pos); return ang; void removemitarbeiter (Angestellter ang) { Mitarbeiter.removeElement (ang);
Grundlagen der Softwaretechnik Übung 8: Implementierung in Java 56 Polymorphismus Operationen sind automatisch polymorph Nicht-polymorphe Operation muss explizit als final deklariert werden Dann kann diese Operation nicht überschrieben werden class Grafikobjekt { public void zeichnen() {... class Kreis extends Grafikobjekt { public void zeichnen() {... class Rechteck extends Grafikobjekt { public void zeichnen() {... Grafikobjekt einegrafik; einegrafik = new Kreis(); einegrafik.zeichnen(); einegrafik = new Rechteck(); einegrafik.zeichnen(); //zeichnet Kreis //zeichnet Rechteck Mehrfachverebung In Java ist Mehrfachvererbung für Klassen nicht realisiert. Statt dessen Schnittstellenkonzept o Schnittstelle kann nur abstrakte Operationen und Konstanten weitergeben o Keine Attribute und Implementierungen von Operationen Mehrfachvererbung und Schnittstellen sind nicht gleichzusetzen! class B1 {... interface B2 {... interface B3 {... class D extends B1 implements B2, B3 {...
Grundlagen der Softwaretechnik Übung 8: Implementierung in Java 57 Zustandsautomat in Java Verschiedene Implementierungen möglich: 1. Implementierung mit Zustandsattribut (Aufzählungstyp) In Java existiert kein benutzerdefinierbarer Aufzählungstyp Lösung z.b. mit Integer Konstanten class Schublade { private int classstate; // mögliche Zustände final static int OFFEN = 1; final static int ZU_UNVERSCHLOSSEN= 2; final static int ZU_VERSCHLOSSEN= 3; // Zustandsattribut speichert // aktuellen Zustand public void oeffnen() { // Jede Operation muss Zustandsattribut abfragen if (classstate == ZU_UNVERSCHLOSSEN { classstate = OFFEN; // Aktualisierung des //Zustandsattributs, wenn mit //der Operation ein //Zustandswechsel verbunden ist... 2. Überführung in Zustandsmuster => siehe Kapitel 6 3. Implementierung mit switch-case-anweisung Switch / While Idiom für Zustandsdiagramme Implementierungsmuster (Idiom) für Zustandsdiagramme Bildet Zustandsdiagramm in strukturierten Code nach einem generischen Codemuster ab Gleiche Struktur im Zustandsdiagramm und Code Abbildung von entry, do und exit-aktionen Abbildung hierarchischer Zustände Nachteil: Ereignisbasiert - keine Ausnutzung objektorientierter Konzepte
Grundlagen der Softwaretechnik Übung 8: Implementierung in Java 58 Zustandsdiagramm: Time Mode entry: do: display time exit: button pushed button pushed Date Mode entry: do: display date exit: Strukturiertes Programm in Pseudocode:
Grundlagen der Softwaretechnik Übung 8: Implementierung in Java 59 START WHILE TRUE SWITCH currentstate CASE time mode: WHILE NOT button pushed display time currentstate:= date mode BREAK CASE date mode: WHILE NOT button pushed display date currentstate:= time mode BREAK ENDSWITCH END Regeln des Idioms: Abbildung Zustandsdiagramm in o currentstate variable o While-Schleife mit switch-case Grundgerüst, das alle Zustände als einzelne Anweisungen enthält Die Zustände, die Aktionen in einem Zustand werden durch weitere while- Schleife implementiert. Bei Verlassen eines Zustandes durch einen Zustandsübergang wird die Variable current State aktualisiert. Realisierung hierarchischer Zustände o Erzeugen eines switch / while Blocks für jeden flachen Zustand o Schachtelung Zustandshierachie gemäß START WHILE TRUE SWITCH currentstate CASE time mode: WHILE NOT button pushed display time currentstate := date BREAK CASE date mode: WHILE NOT button pushed display date currentstate := time BREAK ENDSWITCH END Zusammenfassung Statisches Modell ist direkt in Java implementierbar
Grundlagen der Softwaretechnik Übung 8: Implementierung in Java 60 Bidirektionale Assoziationen benötigen Verwaltung in beiden Klassen Zustandsautomaten können mit verschiedenen Implementierungsstrategien implementiert werden o Mit Zustandsattribut o Mit Zustandsmuster o Mit Switch-Case Anweisungen (Hilfsmittel: Switch/While Idiom)