Definition
Aggregation
Aggregationen sind Spezialfälle der binären Assoziationen (Beziehungen zwischen zwei Klassen bzw. deren Objekten), bei der ein Objekt ein Teil von mehreren zusammengesetzten Objekten sein kann und auch unabhängig von dem zusammengesetzten Objekt existieren kann.
Im Unterricht der gymnasialen Oberstufe werden solche Beziehungen auch als KENNT-Beziehungen bezeichnet. Allerdings trifft das auch für eine andere Art der Assoziation zu, nämlich auf die Komposition.
Beispiel 1
public class Vorlesung { private Dozent leiter; public Vorlesung (Dozent leiter) { this.leiter = leiter; } }
Die Instanzvariable leiter wird in den Objekten der Klasse Vorlesung nicht neu erzeugt, sondern existiert bereits und wird dem Konstruktor als Parameter übergeben.
Wenn das Vorlesungs-Objekt gelöscht wird, kann das Dozent-Objekt dennoch weiter existieren.
Dozent hobbit = new Dozent("Frodo Beutlin"); Vorlesung hobbitkunde = new Vorlesung(hobbit);
In diesem Beispiel wurde der Dozent hobbit außerhalb des Vorlesung-Objektes hobbitkunde erzeugt und dem Konstruktor der Klasse Vorlesung als Parameter übergeben.
Beispiel 2 (aus [4])
Eine Klasse Restaurant besitzt als Instanzvariable eine ArrayList stuhl, in der Objekte der Klasse Stuhl gespeichert werden können. Diese Objekte werden aber nicht in den Restaurant-Objekten erzeugt, sondern existieren bereits vorher. Sie werden der ArrayList dann mithilfe der Restaurant-Methode addStuhl(Stuhl s) hinzugefügt:
class Restaurant { ArrayListstuhl = new ArrayList<>(); public void addStuhl(Stuhl s) { stuhl.add(s); } public Stuhl removeStuhl() { stuhl.remove(stuhl.size()-1); } }
Die remove()-Methode entfernt zwar das Stuhl-Objekt aus der ArrayList der Klasse Restaurant, damit wird der Stuhl aber nicht vernichtet, sondern wird als Rückgabewert an die aufrufende Methode "lebend" zurückgeliefert und kann dort weiterverwendet werden. Er könnte dann zum Beispiel in einem Lager zwischengelagert werden und dann in einem anderen Restaurant-Objekt wieder zugefügt werden.
Verallgemeinerung [4]
Bei einer Aggregation ist die aggregierende Klasse (in unserem letzten Beispiel Restaurant) nicht für die Erzeugung der aggregierten Teile (in unserem Beispiel die Stuhl-Objekte) zuständig. Die aggregierenden Teile (die Stühle) müssen vorher erzeugt und der aggregierenden Klasse als Referenzen auf bestehende Objekte übergeben werden.
Diese Objekte können gleichzeitig auch von anderen aggregierenden Klassen verwendet werden.
In unserem Beispiel ist das etwas unrealistisch. Ein Stuhl s kann zu einem bestimmten Zeitpunkt t nur ein genau einem Restaurant r stehen und nicht gleichzeitig in zwei oder mehreren Restaurants.
In Java könnte man ein Objekt s der Klasse Stuhl trotzdem gleichzeitig an zwei verschiedene Objekte der Klasse Restaurant übergeben, da ja nur Referenzen übergeben werden, die auf das eigentliche Objekt verweisen.
Einer Aggregation können die einzelnen Teile wieder entnommen werden, ohne dass die Aggregation dabei zerstört wird.
Selbst wenn mir mit der remove()-Methode alle Stühle des Restaurants entfernen, bleibt das Objekt der Klasse Restaurant bestehen.
- Lahres et al.: Objektorientierte Programmierung, Rheinwerk Computing 2021.
- Barnes, Kölling: Java lernen mit BlueJ - Objects first. Pearson-Verlag 2019.
- Ullenboom: Java ist auch eine Insel, Rheinwerk Computing 2023.
- Kecher et al.: UML 2.5 - Das umfassende Handbuch, Rheinwerk Computing 2021