3.1 Kapselung
Daten vor unkontrolliertem Zugriff schützen
Um sicherzustellen, dass Attributwerte von anderen Objekten nicht unkontrolliert verändert werden, kann der Zugriff beschränkt werden. In der Klasse – dem Objektbauplan – wird dazu festgelegt, dass die entsprechenden Attribute privat sind. Nur das Objekt, dem das Attribut gehört, kann jetzt noch direkt darauf zugreifen.
Beispiel
Wird in der Klasse Roboter festgelegt, dass das Attribut farbe privat ist, kann nur noch der Roboter, dem der Attributwert gehört, direkt darauf zugreifen. Versucht ein anderes Objekt dem privaten Attribut farbe unseres Roboters robi direkt einen Wert zuzuweisen (Abb. 3-1), führt dies nun zu einer Fehlermeldung.
Öffentliche Methoden ermöglichen einen kontrollierten Zugriff
Sollen andere Objekte bestimmte Daten abfragen beziehungsweise ändern dürfen, können hierfür entsprechende Methoden bereitgestellt werden. Diese müssen öffentlich und damit für jedes Objekt aufrufbar sein.
Abfrage von Daten: get-Methode
Für private Attribute, deren Daten anderen Objekten zugänglich gemacht werden sollen, wird jeweils eine öffentliche get-Methode bereitgestellt. Der Methodenname setzt sich dabei aus dem Präfix „get“ und dem mit einem Großbuchstaben beginnenden Attributnamen zusammen, zum Beispiel getFarbe(). Die Methode enthält in der Regel nur eine Anweisung, nämlich den Wert des betroffenen Attributs an den Aufrufer der Methode zurückzugeben.
Änderung von Daten: set-Methode
Sollen andere Objekte den Wert eines Attributs ändern dürfen, wird hierfür eine öffentliche set-Methode bereitgestellt, zum Beispiel setFarbe(pFarbe: String). Das aufrufende Objekt muss dabei der Methode als Argument den Wert übergeben, den es dem betroffenen Attribut zuweisen möchte. Der Datentyp der Argumente muss dabei zu dem Attributtyp passen.
Im einfachsten Fall enthält die set-Methode lediglich eine Anweisung, die das Argument dem betroffenen Attribut zuweist. Die Zuweisung eines neuen Attributwerts erfolgt dabei genauso unkontrolliert wie bei einem öffentlichen Attribut, auf das direkt (ohne Umweg über eine öffentliche Methode) zugegriffen wird.
Der Vorteil einer öffentlichen set-Methode zeigt sich jedoch dann, wenn sichergestellt werden soll, dass einem privaten Attribut von anderen Objekten nur bestimmte Werte zugewiesen werden. Die set-Methode muss dabei das übergebene Argument zunächst prüfen und darf es nur dann dem betroffenen Attribut zuweisen, wenn es der jeweiligen Anforderungen entspricht. Zum Beispiel könnte eine solche Anforderung verlangen, dass das übergebene Argument einem bestimmten Wertebereich angehört.
Beispiel
Innerhalb der Klasse Roboter ist die öffentliche Methode setFarbe(pFarbe: String) so gestaltet, dass sie zunächst prüft, ob der als Argument übergebenen String eine erlaubte Farbe repräsentiert. Ist dies der Fall, weist sie dem Attribut farbe den übergebenen Wert zu. Andernfalls gibt sie eine entsprechende Fehlermeldung aus.
Der im Beispiel (Abb. 3-2) übergebene String "zitronengelb" repräsentiert keine vorgesehene Farbe. Die setFarbe-Methode gibt daher eine entsprechende Fehlermeldung aus:
Indem das Attribut farbe
als privat gekennzeichnet wird, bleibt anderen Objekten lediglich die Möglichkeit mit Hilfe der öffentlichen Methoden setFarbe(pFarbe: String) und getFarbe() auf das private Attribut zuzugreifen. Im Quellcode dieser Methoden können dann zum Beispiel Kontrollen eingebaut werden, die den Zugriff nur unter bestimmten Bedingungen zulassen. Bei öffentlichen Attributen gibt es für das Objekt, dem diese gehören, keine Möglichkeit den Zugriff zu kontrollieren.
Kapselung von Attributen und Methoden
Das Konzept, bestimmte Attribute und Methoden als privat zu kennzeichnen und so vor anderen Objekten zu verbergen, wird als Kapselung bezeichnet. Bildlich gesprochen schließt ein Objekt seine privaten Attribute und Methoden dabei in einer „Kapsel“ ein, so dass diese nur noch für es selbst, nicht aber für andere Objekte erreichbar sind.
Beispiel
Im UML-Klassendiagramm werden private Attribute und Methoden durch ein Minuszeichen und öffentliche durch ein Pluszeichen gekennzeichnet.