Getter & Setter
und Access Modifier

Mit dem Laden des Videos akzeptierst du die Datenschutzerklärung von YouTube. Wenn du die Menge an Daten reduzieren möchtest, die YouTube von dir sammelt, solltest du dich vorher aus deinem YouTube-Account ausloggen, das Speichern von Cookies für das Google-Ads-Programm deaktivieren und/oder Cookies im Browser blockieren.
YouTube immer automatisch ladenInhaltsverzeichnis
Als Text lesen
Stell dir vor du entwickelst zusammen mit deinen Kollegen einen Online-Shop, in dem unter anderem mit Nutzer-Adressen hantiert wird. Dafür schreibst du folgende Klasse:
Beispielsweise kann in einem Objekt der Klasse Address
die Adresse "Arcisstraße 21, 80333 München" gespeichert werden.
Dein Kollege verwendet deine Klasse an anderer Stelle in eurem Projekt, um darin auf Attribute wie z.B. street
zuzugreifen. Er baut also Abhängigkeiten zu deiner Implementierung auf.
Nachdem euer Online-Shop ein voller Erfolg ist fällt dir auf, dass du nicht bedacht hast, dass es auch internationale Kunden gibt die keine deutsche Adresse besitzen. Beispielsweise die Adresse "240 W 55th St, New York, NY 10019" lässt sich mit deiner Implementierung nicht so wirklich gut speichern. Also veränderst du kurzerhand deinen Code:
Mit dieser Implementierung können nun sowohl internationale (Konstruktor 1) als auch speziell deutsche Adressen (Konstruktor 2) gespeichert werden. Die Ausgabe der Methode createAddressString
ist für deutsche Adressen immer noch genau die gleiche wie zuvor.
Allerdings hast du mit dieser Änderung komplett die Funktionalität des Programmteils deines Kollegens zerstört. Dieser hat sich darauf verlassen, dass er auf das street
Attribut zugreifen kann, welches jetzt nicht mehr existiert. Das ist sehr blöd. Noch blöder sieht sowas aus, wenn dein Code beispielsweise bereits in einer Programmbibliothek veröffentlicht wurde und von anderen Entwicklern verwendet wird, zu denen du keinen Kontakt hast.
Die Lösung
Trenne grundsätzlich Schnittstelle von Implementierung!
In dem Beispiel hätte es gereicht, wenn dein Kollege nur Zugriff auf die Methode createAddressString
gehabt hätte. Du hättest es also irgendwie schaffen müssen, deinen Kollegen davon abzuhalten, Abhängigkeiten zu Details deiner Implementierung aufzubauen, und stattdessen nur über die Schnittstelle createAddressString
zu gehen. Überraschung, in Java geht das!
Mit Access Modifiers lässt sich festlegen, welche Programm-Teile nach außen hin sichtbar sind. Zwei davon lauten:
public
: Das betroffene Element ist von überall aus sichtbarprivate
: Das betroffene Element ist nur innerhalb der eigenen Klasse sichtbar
Im UML Klassendiagramm markiert man private
Felder mit einem -
, und public
Felder mit einem +
.
Eine deutlich bessere Implementierung wäre also von Anfang an gewesen:
Hättest du nun deine Implementierung ändern wollen, wäre dies kein Problem mehr gewesen. Die private
Modifier garantieren, dass es keinen direkten Zugriff auf die jeweiligen Objektattribute von außerhalb der Klasse geben kann. Da du darauf achtest, die Funktionalität nach außen hin nicht zu verändern, gibt es keine Probleme für andere Entwickler.
Wenn du weder public
noch private
verwendest, wird in Java standardmäßig der Package Modifier verwendet. Dieser verhält sich für uns erst einmal ähnlich wie public
. Es ist jedoch best practice, für Klassen, Objektattribute, Konstruktoren, und Methoden explizit anzugeben, ob diese public
sichtbar sein sollen oder nicht.
Was, wenn jetzt aber doch ein Attribut nach außen sichbar sein soll?
Du möchtest ein Attribut für andere Klassen public
zur Verfügung stellen, aber trotzdem die Macht darüber behalten, eventuell Änderungen an deiner Implementierung vorzunehmen. Genau dafür gibt es Getter & Setter.
Getter & Setter sind Methoden, die ein private
Objektattribut nach außen hin lesbar bzw. modifizierbar machen. Für das Attribut
könnte ein Getter und ein Setter so aussehen:
Über den Getter lässt sich name
auslesen, ohne direkten Zugriff auf das Attribut zu benötigen. Über den Setter kann name
durch einen neuen Wert ersetzt werden.
Falls nun die Implementierung geändert wird, gibt es keine Abhängigkeiten zu name
, die Probleme bereiten. Lediglich die Getter und Setter müssen so angepasst werden, dass die Funktionalität nach wie vor gegeben ist.
Für einen Musik-Streaming-Dienst wird eine Datenbank aus Songs angelegt. Deine Aufgabe ist es, eine Klasse Song
zu erstellen, deren Instanzen jeweils Informationen über ein bestimmtes Lied enthalten.
a) Erstelle die Klasse Song
mit den folgenden Attributen:
String title
: Der Titel des SongsString artist
: Der Interpret des SongsString album
: Das Album des Songsint year
: Das Veröffentlichungsjahr des SongsString[] genres
: Die Genres, zu denen der Song passtdouble duration
: Die Dauer des Songs in Sekundenint streamCount
: Die Anzahl, wie oft dieser Song bereits abgespielt wurde
b) Füge einen Konstruktor hinzu, der alle Attribute entgegen nimmt und setzt. Ausnahme: streamCount
soll nicht übergeben werden, sondern mit 0
initialisiert werden.
c) Implementiere anschließend für alle Attribute Getter und Setter

Mit dem Laden des Online Editors akzeptierst du die Datenschutzerklärung von JDoodle, einem Produkt der Nutpan pty Ltd (Australien). JDoodle verwendet die Tools reCAPTCHA und Google Analytics, wodurch Daten an Google übertragen werden können. Ich habe leider keinen Einfluss auf diesen Prozess. Du kannst Google Analytics über ein Browserplugin deaktivieren.
Online Editor immer automatisch ladenDurch Verwendung von Getter und Setter Methoden würde es nun nichts ausmachen, wenn beispielsweise das duration
Attribut plötzlich nicht mehr als double, sondern als String
gespeichert werden sollte. Es müssten lediglich Getter und Setter für dieses eine Attribut so angepasst werden, dass die Funktionalität bestehen bleibt. (z.B. durch Umwandlung von einer Dauer 123.0
in "2:03"
und umgekehrt.)
Häufige Fehlerquellen
public
vorclass
vergessenpublic
undprivate
vertauschterror: constructor Song in class Song cannot be applied to given types
: Dein Konstruktor soll nur die ersten 6 Attribute in der richtigen Reihenfolge übergeben bekommen- Rechtschreibfehler irgendwo in Getter & Setter