![]() |
|
|||||
Hat z.B. die Coupe-Klasse einen 10-prozentigen Aufschlag, so erwartet man beim Aufruf der Methode gesamtKosten(coupe,4), dass die zum Coupe-Objekt passende Methode getTarif() aufgerufen wird: class Kategorie { double tarif; } class PKW { Kategorie kat; public double getTarif() { return kat.tarif; } } class Coupe extends PKW { public double getTarif() { return kat.tarif * 1.1; } } 4.2 Klassen-Beziehungen in der UML
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Frei nach »a fool with a tool is still a fool« können UML-Diagramme auch Schwachsinn korrekt dokumentieren. |
Diese Einführung ist sehr kurz und beschränkt sich auf die Werkzeuge, die hauptsächlich benötigt werden, d.h. Klassen-, Objekt- und Sequenz-Diagramme.
Alle anderen Diagrammtypen – sofern verwendet – werden hier nicht vorgestellt, sie werden im Kontext erklärt oder sind intuitiv verständlich (siehe z.B. Abb. 3.1).
Die einfachste Art, in der UML eine Klasse darzustellen, ist ein Klassensymbol: ein Rechteck, welches den Klassennamen enthält.
Einfache Darstellung von Klassen
|
Sollen Interna der Klasse dargestellt werden, kann das Rechteck je nach Bedarf in zwei oder drei Fächer (compartments) eingeteilt werden (siehe Abb. 4.5).
Klassen mit Fächern (Compartments)
|
In der Klassen-Notation treten noch folgende Begriffe auf, deren Semantik auf die Programmiersprache abzubilden ist:
| Unter Sichtbarkeit versteht man die Zugriffsrestriktionen: |
| + für public: alle haben Zugriff, |
| # für protected: die Klasse und alle ihre Spezialisierungen haben Zugriff und |
| - für private: nur die Klasse hat Zugriff. |
Klassen-Attribute und -Operationen
| Klassen-Attribute bzw. -Operationen werden durch Unterstreichen gekennzeichnet. |
Da Klassen-Attribute nicht zum Objekt, sondern zur Klasse gehören, werden sie von allen Objekten benutzt und enthalten daher objektunabhängige Informationen (siehe rechtes Beispiel in Abb. 4.5).
Diese ausführliche Klassen-Darstellung ist nahezu beliebig variierbar.
Variationen in der Darstellung von Klassen
Sehr häufig werden nur die Operationen dargestellt, die außerhalb der Klasse verwendet werden können (zwei Fächer, ohne Sichtbarkeitsangabe). Bei Operationen werden häufig die Parameternamen und/oder Typenangaben weggelassen.
Wird ausschließlich Java als Implementierungssprache verwendet, werden sogar Attribute und/oder Operationen als Java-Deklarationen geschrieben (was natürlich nicht der UML-Notation entspricht, aber durchaus praktisch sein kann).
Generalisierung und Spezialisierung werden in Form von Oberklassen (Superklassen) und Unterklassen (Subklassen) modelliert.
Eine Unterklasse wird durch einen geschlossenen Pfeil aus der Oberklasse abgeleitet, wobei der Pfeil in Richtung Oberklasse zeigt.
|
Auch wenn es dem OO-Paradigma zuwiderläuft, nicht sehr viele Beziehungen zwischen Klassen bzw. Objekten lassen sich in das Generalisierungs-/Spezialisierungs-Schema pressen. Versucht man es trotzdem, rächt sich dies spätestens bei der Implementierung, d.h. bei der Erstellung der Applikation.
In Abb. 4.7 sind neben der Spezialisierung weitere wichtige Beziehungen dargestellt.
Arten von
Beziehungen (nicht in der UML)
|
Für die Unterscheidung zwischen Ähnlichkeit und Spezialisierung gibt es keine einfachen Kriterien.
|
Im Zweifelsfall halte man sich an die einfache Heuristik: »Es liegt Ähnlichkeit vor«. |
Die UML – bereits abgestimmt auf Java – differenziert ein wenig anders als oben dargestellt.
Wichtige UML-Beziehungen für Java
|
Die Assoziation umfasst Zuordnung/Mitglied, Aggregation und Komposition differenzieren die Teil-von-Beziehung, und die Implementation (Realization) deckt das große Feld der Ähnlichkeit ab.6
Anhand von Java-Klassen-Fragmenten sollen die einzelnen Beziehungen kurz vorgestellt werden.
Bei der Assoziation beschränken wir uns hier auf den häufigsten Fall der binären Assoziation. Assoziationen beschreiben Beziehungen wie:
Assoziation:
isRelatedTo, isMemberOf
Student besucht Vorlesung (isRelatedTo – eine Beziehung), Student gehört zur Praktikumsgruppe (isMemberOf – eine Gruppen-Beziehung).
|
Beziehungen sind mathematisch gesehen Relationen mit entsprechender Semantik. Diese Sicht ist für das Verständnis der Multiplizitäten interessant, die sich auf die Objekte beziehen (siehe Regeln!).
Sei Student = { s1, ... ,sn } und Praktikum = { p1, ... ,pn }, dann ist die Assoziation mathematisch eine Relation:
isMemberOf = { (s1,p1), (s2,p1), (s2,p2), (s2,p3), (s3,p1), (s3,p3), (s5,p1), ... }
Für Assoziationen gelten folgende Regeln:
Abhängigkeiten,
Multiplizität, Symbol *
| 1. | Zwischen den beteiligten Klassen bestehen keine essenziellen Abhängigkeiten, d.h., ihre Objekte können unabhängig voneinander erschaffen und zerstört werden. |
| 2. | Die Multiplizität min..max an der Beziehung beschreibt die minimale bzw. maximale Anzahl von Objekten, mit der ein Objekt der gegenüberliegenden Klasse verbunden ist. Ist min gleich max, genügt eine Angabe. |
| 3. | Der Stern * steht für ein beliebiges oder nicht näher spezifiziertes Maximum. Steht nur ein Stern, ist dies die Abkürzung für 0..*. |
Erklärung zu Abb. 4.9: Zwischen Student und Praktika bestehen keine essenziellen Abhängigkeiten (ein Student wird nicht entsorgt, wenn das Praktikum aufgelöst wird!).
Die angegebene Multiplizität 4..18 steht für die Forderung, dass jedes Praktikum aus zumindest vier bis maximal 18 Studenten bestehen sollte. Ein Student kann an einer nicht näher spezifizierten Anzahl von Praktika teilnehmen.
Die isMemberOf-Beziehung soll den besonderen Set-Charakter der Assoziation hervorheben und hat die Bezeichnung member.
Referenzen: Assoziationen in Java
In Java werden (binäre) Assoziationen am einfachsten durch Referenzen der beteiligten Klassen aufeinander realisiert.
class Student { ... }
class Praktikum { // nur relevanter Teil final int MAXSTUDS= 18; int numStud; Student[] pStudent; // hält isMemberOf-Beziehung fest
boolean joinStudent (Student stud) { // z.B. triviale if (numStud==MAXSTUDS) return false; // Implementation if (pStudent==null) pStudent= new Student[MAXSTUDS]; pStudent[numStud++]= stud; return true; } }
Ist die Rolle unklar, die ein Objekt bei der Beziehung spielt, kann sie durch Beziehungsnamen konkretisiert werden.
Dies ist immer bei rekursiven Beziehungen (der Klasse mit sich selbst) notwendig (siehe Abb. 4.10).
|
|
Abb. 4.10 zeigt eine Lösung zu dem Organigramm in Abb. 4.3, welche nicht nur keine Spezialisierung verwendet, sondern den entscheidenden Vorteil hat, dass die Hierarchie nicht begrenzt ist.
Ein Einmannunternehmen kann somit genauso gut dargestellt werden wie ein Konzern.8
Rekursive Klassen-Struktur in Java
Die zugehörige Java-Lösung ist natürlich auch rekursiv und damit verblüffend einfach:
class Abteilung { // nur relevanter Teil Abteilung oAbt; // Referenz auf Objekt derselben Klasse, // d.h. die übergeordnete Abteilung
void setOberAbteilung (Abteilung oAbt) { this.oAbt= oAbt; // zu this siehe 3.5.3 } }
Rekursive Strukturen implizieren rekursive Methoden
Die Referenz oAbt zeigt immer auf die übergeordnete Abteilung, wobei nur die »Geschäftsführung« keine mehr hat, d.h., oAbt ist dann null.
Rekursive Klassen-Strukturen ziehen zur Traversierung ihrer Struktur rekursive Algorithmen, d.h. Methoden, nach sich.
Assoziationen zeigen die logischen Zusammenhänge zwischen Klassen. Interessant an der Implementation ist aber, ob man von jeder Seite der Beziehung oder nur von einer Seite zur anderen »navigieren« kann.
Gerichtete Pfeile signalisieren
Navigierbarkeit
| Ist aufgrund der Implementation nur in eine Richtung ein Zugriff möglich, sollte die Linie durch einen gerichteten Pfeil in diese Richtung ersetzt werden (siehe Abb. 4.11). |
Ein Linie ohne Pfeile bedeutet in den weitaus meisten Fällen nicht Navigation in beide Richtungen, sondern nur, dass sie nicht näher spezifiziert ist. Man lässt die Implementation einfach offen.
| Soll ein Diagramm die Implementation widerspiegeln, so sollten Linien durch Doppelpfeile ersetzt werden, sofern in beide Richtungen navigiert werden kann (siehe Abb. 4.11). |
|
Aggregation:
Eine istTeilvon-Beziehung
Ist die Assoziation eine Ganzes-Teile-Beziehung (whole-part-relation), in der ein Objekt der einen Klasse logisch gesehen aus Teilen der anderen Klasse besteht, modelliert man dies als Aggregation oder sogar Komposition.
Komposition: Eine existenzabhängige Aggregation
Der Unterschied zwischen Aggregation und Komposition liegt darin, dass die enthaltenen Objekte existenziell abhängig sind vom Aggregations-Objekt, d.h., wird das Aggregations-Objekt zerstört, sind auch die enthaltenen Objekte nicht mehr existent.
| Bei einer Aggregation wird die Verbindungslinie auf der Aggregat-Seite durch eine Raute ergänzt, bei der Komposition ist das Innere der Raute schwarz. |
Die Beziehungen im folgenden Diagramm sind an das Collection Framework angelehnt, wobei Map und Entry als Klasse modelliert sind. In der J2SE sind sie Interfaces.
|
Map: Container für Schlüssel-Werte-Paare
Unter einer Map versteht man in Java einen Container (Behälter) – in Java generell auch Kollektion genannt –, der Werte (Values) zusammen mit ihren Schlüsseln (Keys) aufnehmen kann. Ein Schlüssel-Werte-Paar heißt dann Entry bzw. Eintrag (siehe Abb. 4.12).9
Der Schlüssel muss eindeutig sein, darf also nur einmal in der Map bzw. in allen Einträgen vorkommen (Multiplizität 1–1). Anhand seines Schlüssels kann somit ein Wert-Objekt eindeutig in der Map gefunden werden.
Ein Eintrag gehört nur zu einer Map. Wird die Map zerstört, sind alle Einträge ebenfalls entsorgt.
Die Schlüssel- und Werte-Objekte sind unabhängig von der Map. Sie können durchaus in anderen Maps oder Objekten enthalten sein. Ihre Existenz hängt damit nicht von dem Eintrag oder der Map ab.
Multiplizität 0..1 bei Kompositionen
Objekte können nur in einem Kompositions-Objekt enthalten sein, die Multiplizität ist damit auf der Kompositions-Seite 0..1 oder 1 und wird in der Regel weggelassen.
Für Kompositionen lässt die UML auch eine alternative Darstellung zu (siehe rechtes Diagramm in Abb. 4.13).

Primitive Typen werden nicht modelliert
Felder mit primitivem Typ haben immer Werte-Semantik und sind damit immer existenziell vom Objekt abhängig. Hier gilt die Regel:
| Primitive Attribute eines Objekts sind nicht als Komposition zu modellieren (Beziehungen bestehen nur zwischen Klassen!). |
Im folgenden Diagramm (Abb. 4.13) wird ein Top-Level-Container Frame aus dem Package java.awt dargestellt, welches aus einer Titel-, einer Menü-Leiste und vielen Komponenten besteht.10
|
Aggregation und Komposition werden in Java ebenfalls durch Referenzen in den Klassen dargestellt, da sie ja nur spezielle Formen der Assoziation sind (siehe Abb. 4.8).
Man könnte damit zur Tagesordnung übergehen, wenn da nicht die essenzielle Abhängigkeit bei der Komposition und die Forderung bestehen würde, dass die Teil-Objekte nur in einem einzigen Kompositions-Objekt sein dürfen.
Es gibt keine reine Objekt-Komposition in Java
| Für Komposition gibt es – mit Ausnahme der Felder vom primitiven Typ – in Java kein direktes sprachliches Äquivalent/Konstrukt. |
Das Problem liegt in der Referenz-Semantik von Objekten.
Sobald das Kompositions-Objekt eine Referenz des enthaltenen Objekts nach außen liefert, können beliebig viele Objekte das Teil-Objekt referenzieren. Damit kann es gar nicht mehr essenziell abhängig sein und jederzeit in beliebigen Assoziationen (auch Kompositionen) auftreten.
Komposition durch Programm-Design
| Die Kompositions-Problematik ist also nicht trivial und taucht leider in vielen Bereichen auf. |
Komposition muss durch spezielle Methoden, Konventionen oder (im Spezialfall) durch innere Klassen sichergestellt werden.11
Ein passendes Design-Konzept zur Komposition ist ein
Komposition durch exklusiven Zugriff
|
exklusiver Zugriff: Das äußere Objekt erschafft das innere und liefert keine Referenz des inneren Objekts nach außen, sondern – sofern notwendig – nur eine Kopie, d.h. einen Klon. |
Klon (Clone):
Eine Kopie des Objekts
Ein Klon bzw. Clone ist ein neues Objekt derselben Klasse, wobei die Felder dieselben Werte haben wie die des Original-Objekts.
Komposition in Java am Beispiel Auftrag
Das o.a. Design-Konzept wird anhand des Auftrags in Abb. 4.14 mit minimalistischen (Java-)Mitteln (ohne Cloning, Konstruktoren, Ausnahmebehandlung und Zugriffsschutz) umgesetzt.
|
class AuftragsPosition { // Klasse als Datenstruktur String artikel; // wie ein struct in C++ double preis; }
class Auftrag { // nur relevanter Code private List apList= new ArrayList(); // Positionen
void addAuftragPos (String artikel, double preis) { AuftragsPosition ap= new AuftragsPosition(); ¨ ap.artikel= artikel; ap.preis= preis; apList.add(ap); // am Listen-Ende einfügen }
AuftragsPosition getAuftragsPosition(int pos) { if (pos < apList.size()) { AuftragsPosition ap= (AuftragsPosition)apList.get(pos); AuftragsPosition clone= new AuftragsPosition(); ¦ clone.artikel= ap.artikel; clone.preis= ap.preis; return clone; // nicht: return ap; ¬ } else return null; } }
Erklärung: Bei ¨ wird eine Auftragsposition als inneres Objekt erschaffen, zu dem äußere Objekte keinen Zugriff haben. Mit ¦ und ¬ wird eine Kopie herausgereicht.
Wird alternativ bei ¬ die Auftragsposition mit return ap; zurückgeliefert, kann mit Hilfe der Referenz ap das Auftragspositions-Objekt auch außerhalb des Auftrags verwendet werden. Damit wäre dies dann keine Komposition mehr, sondern eine Aggregation.
Da die UML sprachunabhängig ist, muss es möglich sein, durch Erweiterungen (oder Auslassungen) UML-Diagramme an die spezifischen Belange einer Sprache anzupassen.
Constraints:
Zusicherungen und Einschränkungen in Diagrammen
Mit Hilfe von Zusicherungen bzw. Einschränkungen (constraints) können wichtige Details – sprachabhängig oder -unabhängig – Diagrammen hinzugefügt werden.
| Zusicherungen werden in geschweifte Klammern {...} gefasst. |
Nachfolgend Zusicherungen, die häufig verwendet werden:
{abstract}: Klasse hat keine Objekte (siehe auch Abb. 4.15) {disjoint}: Subklassen sind disjunkt, haben keine Objekte gemeinsam {incomplete}: Unvollständigkeit der Darstellung {overlapping}: Subklassen nicht disjunkt {subset}: Assoziation ist Untermenge einer anderenZum Beispiel sollten die drei Subklassen, stellvertretend für alle PKW-Hersteller in Abb. 4.2, durch {incomplete} gekennzeichnet werden.
Zusicherungen können aber auch frei gewählte Bedingungen enthalten:
{wert>=10}UML-Anpassung an Java mittels Stereotype
Durch Stereotype wird die UML anpassbar. Stereotype erweitern oder variieren vorhandene Modell-Elemente:
| Ein Stereotyp ist ein in «..» eingerahmter Begriff, der nicht direkt zum Sprachumfang der UML gehört, aber für die Anwendung, das Modell oder die Programmiersprache notwendig ist. |
Für Java bieten sich die in der UML unbekannten Modifikatoren oder der Begriff »Interface« als Stereotyp an.
Beispiele bekannter und in Java verwendeter Stereotype sind:
«constructor», «implements», «interface», «native»
Ein weiteres, interessantes Stereotyp ist «Powertype». Bei der Generalisierung werden die Mengen aller Objekte der Subklassen in der Superklasse zusammengefasst.
«Powertype»-Klassen führen zu Spezialisierungen (Teilmengen)
Damit beschreibt ein Diskriminator verbal eine Teilmenge der Potenzmenge (Powerset)12 der Superklasse. Ein Diskriminator kann so als spezielle «Powertype»-Klasse gezeichnet oder einfach an eine gepunktete Linie geschrieben werden (Abb. 4.15).
|
Die Klasse Teil ist in Abb. 4.15 mit der Zusicherung {abstract} gekennzeichnet. Es gibt keine Objekte von Teil, sondern nur von den Subklassen. Je nach Diskriminator werden zwei Spezialisierungen vorgenommen.
Die Spezialisierung nach Fremd- oder Eigenbezug ist nicht disjunkt, da dies z.B. von der benötigten Menge oder den Kapazitäten der Fertigung abhängt. Die Spezialisierung nach dem Strukturierungsgrad ist disjunkt, beginnend bei unbearbeitetem Material (Roh- oder Hilfsstoffen) bis hin zum Erzeugnis, dem Endprodukt.
Interface: Definition eines Services
Interfaces (Schnittstellen) werden in der UML mittels des Stereotyps «interface» gekennzeichnet, da sie sprachabhängig sind. In Java gehören Interfaces zum Sprachumfang, in C++ müssen sie mit Hilfe abstrakter Klassen nachgebildet werden.
Fünf wichtige Eigenschaften eines Interfaces in der UML
Die Definition eines Interfaces ist in der UML und Java sehr ähnlich:
| 1. | In der UML ist ein Interface eine benannte Kollektion von (public) Methoden ohne Implementierung, die einen Service bezeichnet, den eine Klasse anderen anbieten kann. |
| 2. | Eine Klasse implementiert ein Interface, indem es alle Methoden des Interfaces deklariert und auch implementiert (Notation: gestrichelter Generalisierungspfeil, optional mit Stereotyp «implements»). |
| 3. | Eine Klasse kann mehrere Interfaces implementieren. |
| 4. | Ein Interface kann spezialisiert, d.h. erweitert werden, wobei das Sub-Interface die Methoden des Super-Interfaces implizit übernimmt. |
| 5. | Interfaces können an Assoziationen beteiligt sein, wobei eine Navigation, die vom Interface startet, in der UML nicht erlaubt ist. |
Interface: Unterschiede der UML zu Java
Die UML erlaubt keine Attribute in Interfaces, wogegen Java konstante statische (public static final) Felder im Interface erlaubt.
Interfaces werden in Java benutzt, um Klassen zu entkoppeln. Klassen benutzen andere Klassen nur über ihr Interface, d.h., Klassen »verbergen« sich hinter ihrem Interface.13
Dies wird durch zwei Notationen in der UML unterstützt:
| Ein Lollipop-Symbol an der Klasse mit Namen des Interfaces |
|
Interfaces haben Rollen-Charakter
Eine Assoziations-Linie mit dem Zusatz Rollenname:Interface-Name oder vereinfacht uses:Interface-Name
|
Interfaces werden ausführlich in Kapitel 6, Interfaces und Pattern, behandelt (siehe insbesondere das Teile-Beispiel in 6.11.1).
Die bisher verwendete Klassen-Notation bzw. die zugehörigen Klassen-Diagramme zeigen nur den Bauplan für Objekte bzw. die Beziehungen zwischen Mengen von Objekten.
In der Interaktions-Modellierung (siehe 4.4) werden aber Objekte statt Klassen verwendet.
Die Objekt-Notationen mit einem zugehörigen Beispiel sind in Abb. 4.18 dargestellt.
Vier Objekt-
Notationen mit Beispielen
|
Je nach Typ des Diagramms, das Objekte verwendet, wird einer der vier in der Abbildung dargestellten Notationen bevorzugt.
Die Angabe eines Objekt-Zustands ist optional, wird aber häufig bei Prozess- oder Aktivitäts-Diagrammen benutzt.
Objekt-Diagramm: Momentaufnahme von Klassen-
Beziehungen
Objekt-Diagramme sind Momentaufnahmen von Klassen-Diagrammen. Sie verdeutlichen anhand einzelner Objekte und deren Verbindungen (Links) ein Klassen-Diagramm. Dabei sind die Verbindungen Instanzen einer Assoziation(s-Linie) und haben deshalb auch keine Multiplizität.
In Abb. 4.19 wird ein Klassen-Diagramm eines Unternehmens und in Abb. 4.20 ein zugehöriges Organigramm als Objekt-Diagramm gezeigt.
|
|
Interaktions-Diagramme: Beschreibung des dynamischen Verhaltens von Objekten
Klassen- wie Objekt-Diagramme sind statische Diagramme. Sie zeigen kein dynamisches Verhalten, d.h. weder den Ablauf von Prozessen, die Interaktion zwischen Objekten aufgrund ihrer Methoden noch das individuelle Verhalten einzelner Objekte.
In der UML gibt es verschiedene Arten von Interaktions-Diagrammen:
| Zustands-Diagramm (für einzelne Objekte) |
| Sequenz-Diagramm (für Interaktion zwischen Objekten) |
| Kollaborations-Diagramm (für komplexe Interaktionen) |
Nachfolgend wird nur das Sequenz-Diagramm vorgestellt, da es u.a. vorzüglich für einfache Interaktionen zwischen verschiedenen Objekten geeignet ist (siehe zu Threads Kapitel 9).
Sequenz-Diagramme visualisieren die Sequenz, in der Objekte miteinander durch Aufruf von Methoden agieren.
Sequenz-Diagramme:
Zeitlicher Ablauf der Nachrichten bzw. Methoden
Die Methodenaufrufe werden auch als »Senden von Nachrichten« (sending messages) bezeichnet, die Resultate der Methoden als »Erhalten von Anworten« (receiving answers).
Die Objekte werden waagerecht angeordnet und die Interaktionen entlang einer Lebenslinie senkrecht unter den Objekten eingetragen (siehe Abb. 4.21).
Notation zu Sequenz-Diagrammen
|
Darstellung der Programm-
Steuerung
Hat ein Objekt die Steuerung des Programms, z.B. durch Ausführen von main(), so kann man auch einen durchgezogenen Aktivierungsbalken zeichnen, obwohl das Objekt bei einem (synchronen) Aufruf einer Methode warten muss. Dies macht die Zeichnung einfacher.
Zu einem kleinen Code-Fragment soll ein passendes Sequenz-Diagramm gezeichnet werden. Dazu wird eine Klasse Teil angelegt, wobei zur Vereinfachung ein Konstruktor verwendet wird (siehe Abschnitt 5.5):
class Teil { String id; // Ident des Teils String bez; // Bezeichnung // zu Konstruktor: siehe 5. Kapitel Teil(String id, String bez) { this.id=id; this.bez=bez; } }
Die Klasse Test hat die Programmkontrolle:
public class Test { public static void main(String[] args) { Teil[] tarr= { new Teil("4-01-001","Pumpe"), new Teil("0-45-070","Lager"), new Teil("3-71-101","Bohrer")};
Map map= new HashMap(); // eine Map, siehe 4.2.5 for (int i=0;i<tarr.length;i++) // Teil unter Schlüssel teil.id ablegen map.put(tarr[i].id,tarr[i]);
tarr= null; // kann zerstört werden
// Teil mit Schlüssel "0-45-070" holen Teil teil= (Teil) map.get("0-45-070"); System.out.println(teil.id+": "+teil.bez);
map= null; // kann zerstört werden //... } }
|
Multi-Objekt: Menge von Objekten, auf die eine Methode ausgeführt wird
Ein Multi-Objekt-Symbol wird hier verwendet um anzuzeigen, dass new() zu einer Menge von (unbenannten) Teilen führt.
Zerstörung von Objekten ist einzig Aufgabe der JVM
Java kennt keine Destruktoren. Die Zerstörungen am Ende der Lebenslinien sind fiktiv, d.h. bleiben der Garbage Collection (Speicherbereinigung) der JVM überlassen (siehe hierzu 5.9.1).
Generalisierung/Spezialisierung – die Is-A-Beziehung – ist der Ausgangspunkt für die Vererbung in Java. Hieraus leiten sich Klassifikation als ein Design-Prinzip und Substitution als zentrale Regel ab.14
Mit Hilfe von Vererbung und Polymorphie können generelle Methoden geschrieben werden, die – abhängig vom konkreten Objekt – die passende Operation ausführen.
Die UML ist eine zu Java komplementäre grafische Design-Methodik, die umfangreiche Werkzeuge zur Modellierung bereitstellt.
Anhand von Diagrammen mit zugehörigen kleinen Code-Fragmenten in Java wurden Klassen-, Objekt- und Sequenz-Diagramme vorgestellt.
Klassen/Objekt-Diagramme zeigen die statischen Beziehungen zwischen Klassen, wobei die Assoziation die häufigste und damit die wichtigste Beziehungsform darstellt.
Assoziationen werden in Java durch Referenzen realisiert, wobei sie die Navigationsrichtungen vorgeben. Komposition kann nur durch Design sichergestellt werden, da die Referenz-Semantik in Java nur Aggregation direkt unterstützt.
Von den Interaktions-Diagrammen, die das dynamische Verhalten eines oder mehrerer Objekte beschreiben, wurden die Sequenz-Diagramme vorgestellt, die den zeitlichen Ablauf und die Interaktion der Objekte recht gut darstellen.
Am letzten Code-Beispiel bzw. Diagramm (Abb. 4.22) wird aber auch deutlich, dass Sequenz-Diagramme nur für die Darstellung von einfachen Interaktionen geeignet sind, da die Modellierung recht schnell groß und unübersichtlich wird.
1 Hier ändert auch der Komponenten-Markt zurzeit nicht allzu viel, da er zu sehr an die Sprachen und Betriebssysteme gebunden ist.
2 Das Vererbungsmuster à la Java ergibt einen Baum (mit genau einer Wurzel), im Gegensatz zu C++, welches Mehrfachvererbung mit beliebig vielen Wurzeln zulässt.
3 Potenziell deshalb, weil man natürlich von einer Klasse auch kein oder nur ein Objekt erzeugen kann.
4 Unter Verhalten versteht man die Reaktion auf die Umwelt. Eigenschaften halten die Werte der Beschreibung eines Objekts fest.
5 Korollar: Folgerung aus einem bewiesenen Satz.
6 Generalisierung und Spezialisierung sind synonym.
7 Erklärung siehe weiter unten.
8 Sofern der Konzern eine Stab-Linien-Organisation hat.
9 Zu Kollektionen siehe Kapitel 14
10 Hier ist nicht modelliert, dass Frame selbst auch eine Komponente ist.
11 Vgl. zu dieser Problematik auch Abschnitt 8.4.3 und 9.8.3.
12 Potenzmenge: Menge PM, deren Elemente alle möglichen Teilmengen der betrachteten Menge M sind. Besteht M aus n Elementen, enthält die Potenzmenge PM 2n Elemente.
13 Die Idee ist äquivalent zu der von Microsofts Component Object Model (COM).
14 Der Zusammenfassung folgen keine Testfragen, da sie konzeptionell zur UML und nicht zu Java gehören. Die UML gehört nicht zur Java-Zertifizierung.
| << zurück |
| |||||
| |||||
| |||||
| |||||
| |||||
| |||||
| |||||
| |||||
Copyright © Galileo Press GmbH 2001 - 2002
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken und speichern. Ansonsten unterliegt das <openbook> denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.
Die Veröffentlichung der Inhalte oder Teilen davon bedarf der ausdrücklichen schriftlichen Genehmigung von Galileo Press. Falls Sie Interesse daran haben sollten, die Inhalte auf Ihrer Website oder einer CD anzubieten, melden Sie sich bitte bei: stefan.krumbiegel@galileo-press.de