Video-Tutorial

Wenn Sie das Video nur anschauen, werden Sie kaum etwas lernen. Arbeiten Sie für den besten Lerneffekt am Rechner direkt mit und vollziehen Sie die Beispiele nach.

Folien



(letzte Synchronisation der PDF-Präsentation: 02.08.2017)

Falls keine PDF-Präsentation zu sehen ist, klicken Sie zum Download hier: Direktdownload PDF-Präsentation

Sie sollten vor Bearbeitung dieses Kapitels die theoretischen Grundlagen der Klassenassoziationen und die UML-Konventionen verstanden haben.

Früher habe ich zur Erarbeitung des Themas das eclipse-Plugin eUML2 Free verwendet (Anleitung). Allerdings habe ich im Informatikunterricht oft die Erfahrung gemacht, dass es gerade dann Ärger macht, wenn man hier mal eine Klasse löscht und sie dann wieder anlegt usw. Ich selbst bin deshalb im Informatikunterricht auf Violet UML ausgewichen (VioletUML im Informatikunterricht).

Bei der programmiertechnischen Implementierung von Assoziationen spielen vor allem Multiplizitäten und Navigierbarkeit eine Rolle. Betrachten wir zuerst die Multiplizitäten:

Multiplizitäten

0..1-Beziehung

beispiel für eine 0..1-Assoziation

Sie müssen im Code festlegen, dass jeder Lehrer genau einer (oder keiner) Sekretärin zugeordnet ist.

Lösung: Sie deklarieren ein Objekt der verbundenen Klasse, initialisieren es aber nicht (zur Erinnerung: deklarieren = anlegen; initialisieren = mit Wert versehen). In der Klasse Lehrer schreiben Sie also:

Java-Code
  private Sekretaerin meineSekretaerin;  

meineSekretaerin ist also ein Objekt der Klasse Sekretaerin; wenn Sie ein Objekt der Klasse Lehrer haben, können Sie ihm eine Sekretaerin zuordnen (z.B. meineSekretaerin = new Sekretaerin()) und entsprechend verwenden (z.B. meineSekretaerin.getName).

1 - Beziehung

Beispiel für eine 1-Assoziation

Sie müssen im Code festlegen, dass jeder Direktor genau eine Sekretaerin hat. Sie müssen sicherstellen, dass ein Direktor KEINE Sekretärin hat.

Lösung: Wie im 0..1-Fall deklarieren Sie ein Objekt der verbundenen Klasse, aber Sie initialisieren es gleich über einen Konstruktorparameter (d.h. das assoziierte Objekt wird dem Konstruktor als Parameter übergeben). In der Klasse Direktor schreiben Sie also etwas wie:

Java-Code
  private Sekretaerin meineSekretaerin; public Direktor(Sekretaerin meineSekretaerin) { this.meineSekretaerin = meineSekretaerin; }  

Es ist also unmöglich, einen Direktor zu erzeugen, der KEINE Sekretärin hat.

* - Beziehung

Beispiel wie bei 1-Beziehung oben:

Beispiel für *-Beziehung im Klassendiagramm

Sie müssen im Code festlegen, dass jeder Sozialarbeiter keinen, einen oder mehrere Schüler hat.

Lösung: Sie deklarieren eine ArrayList mit Objekten der verbundenen Klasse. Damit gibt es die Möglichkeit, die ArrayList zu füllen, sie kann aber auch leer sein (d.h. der Sozialarbeiter kommt neu in die Schule und erhält eine Liste mit den Schülern, die er zu betreuen hat; es kann sein, dass die Liste leer ist (d.h. es gibt die Liste, aber es stehen keine Schüler drauf). In der Klasse Sozialarbeiter schreiben Sie also:

Java-Code
  private ArrayList<Schueler> schuelerliste = new ArrayList<Schueler>();  

1..* - Beziehung

Beispiel für 1..* - Beziehung

Sie müssen im Code festlegen, dass jeder Lehrer mindestens einen (oder mehrere) Schüler hat. Ein Lehrer, der keine Schüler hat, ist sinnlos.

Lösung: Sie deklarieren eine ArrayList mit Objekten der verbundenen Klasse UND intialisieren sie über einen Konstruktorparameter. So vermeiden Sie, dass es Lehrer ohne Schüler gibt (wobei die Schülerliste immer noch leer sein kann, wenn Sie dem Konstruktor eine leere ArrayList übergeben; das müssten Sie über die Programmlogik abfangen). In der Klasse Lehrer schreiben Sie also:

Java-Code
  private ArrayList<Schueler> schuelerliste = new ArrayList<Schueler>(); public Lehrer(ArrayList<Schueler> schuelerliste) { this.schuelerliste = schuelerliste; }    

Navigierbarkeit

Nicht navigierbare Beziehungen

Beispiel für eine nicht navigierbare Assoziation

In diesem Beispiel kennt der Angestellte die Abteilung nicht, er kann nicht auf sie zugreifen.

Die Lösung ist simpel: Sie müssen nichts unternehmen. Wenn der Angestellte keine Referenz auf Abteilung enthält, gibt es in diese Richtung keine Sichtbarkeit.

Diverse Hinweise

Bei bidirektionalen Beziehungen muss berücksichtigt werden, dass bei Änderungs- und Löschvorgängen auch in der assoziierten Klasse entsprechend geändert wird; es muss auch dafür gesorgt werden, dass gewisse Operationen nicht ausgeführt werden können (z.B. dass bei einer MUSS-Beziehung (1...) nicht gelöscht werden kann).

Änderungs- und Löschoperationen werden i.d.R. durch eigene Methoden vorgenommen.

eUML2 erzeugt Ihnen Javacode passend zum UML-Diagramm (Forward-Engineering, vgl. MySQL-Workbench). In der Regel ist der Code brauchbar oder kann zumindest als Grundlage dienen.

Übungen

Alle Übungen finden Sie in der Materialsammlung (dort auch alle zusätzlichen Dateien wie Bilder, Klassendiagramme oder HTML-Vorlagen!).

Die aktuelle Übung können Sie hier als txt-File herunterladen.


***** Übungen: Java/UML - Assoziationen in Java implementieren  *****

Java32c_Assoziationen_Implementierung 1 (unidirektional, einfach)

Verwenden Sie für diese Aufgabe eclipse!

Setzen Sie dieses Klassendiagramm programmiertechnisch um:
16java/java32c_assoziationen-unidirektional.png
(Natürlich hat jede Klasse zwei sinnvolle Attribute, z.B. "name" o.ä.)

Schreiben Sie außerdem in der Klasse Abteilung Methoden, um neue Angestellte hinzuzufügen oder zu löschen.




Java32c_Assoziationen_Implementierung 2 (bidirektional, einfach)

Verwenden Sie für diese Aufgabe eclipse!

*** Sie können hier Ihr Resultat von Aufgabe 1 erweitern! ***

Setzen Sie dieses Klassendiagramm programmiertechnisch um:
java32c_assozationen-bidirektional.png
(Natürlich hat jede Klasse zwei sinnvolle Attribute, z.B. "name" o.ä.)

Versuchen Sie, Methoden zum Löschen und Anlegen von neuen Klassenpartnern zu schreiben - das ist gerade bei bidirektionalen Assoziationen nicht ganz ohne.






Nehmen Sie sich ein paar Klassendiagramme mit einfachen Assoziationen vor und versuchen Sie, sie programmiertechnisch zu implementieren. Versuchen Sie, Methoden zum Löschen und Anlegen von neuen Klassenpartnern zu schreiben - das ist gerade bei bidirektionalen Assoziationen nicht ganz ohne.

Beispiele für einfache Assoziationen:

Unidirektionale:
16java/java32c_artikel-rechnung.png


Bidirektionale:
16java/java32c_assozationen-bidirektional.png
16java/java32c_assoziation-hund-laus.png




Java32c_Assoziationen_Implementierung 3

Setzen Sie dieses Klassendiagramm in Java um:
16java/java32c_assoziation-hund-laus-muetze-loesung.png

Das Programm soll funktionieren! Das bedeutet: Es müssen Objekte angelegt, zugeordnet und gelöscht werden können. Sie können zum Testen weitere Methoden einbauen (z.B. bei Hund: alleLaeuseAuflisten(), was alle Läuse des Hundes mit z.B. Lausname auflistet).