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 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 52 Grundlagen der Softwaretechnik Übung 8: Implementierung in Java 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"; } ... } 53 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); ... } VersicherungGUI init() ermittlePraemie() public interface Versicherung { //abstrakte Operation public abstract double berechnePraemie (double VSumme); } «interface» Versicherung berechnePraemie (double VSumme) Aufruf Lebensversicherung Unfallversicherung berechnePraemie (double VSumme) berechneSonderpraemie(double VSumme) berechnePraemie (double VSumme) class Lebensversicherung implements Versicherung { //Impl. der (abstrakten) Operation mit switch public double berechnePraemie(double VSumme) { double praemie = 0.0; class Unfallversicherung implements Versicherung { // Impl. der (abstrakten) Operation mit if 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; 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; 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) Beispiel: Verwaltung Kardinalität <= 1 einer unidirektionalen Assoziation mit Grundlagen der Softwaretechnik Übung 8: Implementierung in Java KlasseA KlasseB 0..1 eineRolleB: KlasseB RolleB setRolleB(KlasseB einObjektB) getRolleB() : KlasseB removeRolleB() 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 erforderlich! Assoziationen Beispiel: Verwaltung Kardinalität >1 einer Verwaltung unidirektionalen in beiden Klassen Assoziation mit Verwendung der Java-Containerklasse Vector mit Operationen z.B. addElement(), removeElement() und elementAt() Abteilung * Mitarbeiter class Abteilung { protected Vector Mitarbeiter; 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); } } Angestellter 55 Grundlagen der Softwaretechnik Übung 8: Implementierung in Java 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(); //zeichnet Kreis eineGrafik = new Rechteck(); eineGrafik.zeichnen(); //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 {...} 56 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; // Zustandsattribut speichert // aktuellen Zustand // mögliche Zustände final static int OFFEN = 1; final static int ZU_UNVERSCHLOSSEN= 2; final static int ZU_VERSCHLOSSEN= 3; 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 Zustandsdiagramm: Time Mode entry: do: display time exit: button pushed button pushed Date Mode entry: do: display date exit: Strukturiertes Programm in Pseudocode: 58 Grundlagen der Softwaretechnik Übung 8: Implementierung in Java 59 START WHILE TRUE SWITCH currentState CASE time mode: WHILE NOT button pushed display time ENDWHILE currentState:= date mode BREAK CASE date mode: WHILE NOT button pushed display date ENDWHILE currentState:= time mode BREAK ENDSWITCH ENDWHILE 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 whileSchleife 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 START WHILE TRUE SWITCH currentState CASE time mode: WHILE NOT button pushed display time ENDWHILE currentState := date BREAK CASE date mode: WHILE NOT button pushed display date ENDWHILE currentState := time BREAK ENDSWITCH ENDWHILE END gemäß Zusammenfassung Statisches Modell ist direkt in Java implementierbar Grundlagen der Softwaretechnik Übung 8: Implementierung in Java Bidirektionale Assoziationen benötigen Verwaltung in beiden Klassen Zustandsautomaten können mit Implementierungsstrategien implementiert werden o Mit Zustandsattribut o Mit Zustandsmuster o Mit Switch-Case Anweisungen (Hilfsmittel: Switch/While Idiom) verschiedenen 60