Ein Getter ist eine Methode, die den Wert eines privaten Feldes zurückgibt, ein Setter eine Methode, die ihn verändert. Gemeinsam bilden sie den kontrollierten Zugriff auf den inneren Zustand eines Objekts.
Warum private Felder?
Bei der Kapselung gehört der Zustand eines Objekts zur Objekt-internen Angelegenheit. Ein Feld wie name wird private deklariert, damit es keine andere Klasse direkt verändern kann. Wer den Wert lesen oder setzen möchte, nutzt dafür öffentliche Methoden. So bleibt die Klasse als einzige Instanz dafür zuständig, wie ihre Daten aussehen und wie sie sich verändern dürfen.
Klassisches Beispiel in Java
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
if (name == null || name.isBlank()) {
throw new IllegalArgumentException("Name darf nicht leer sein");
}
this.name = name;
}
}
Der Getter liefert das Feld über return zurück, der Setter weist den Parameter dem Feld zu. Beachte das Schlüsselwort this: Es löst den Namenskonflikt zwischen Parameter und gleichnamigem Feld auf (siehe this / self).
Python: Property statt Methodenpaar
In Python sind Getter und Setter als Methodenpaar unüblich. Die idiomatische Lösung ist @property: Der Aufruf bleibt ohne Klammern, als ob es ein Attribut wäre.
class Person:
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self, wert):
if not wert:
raise ValueError("Name darf nicht leer sein")
self._name = wert
Von außen liest und schreibt man einfach person.name — die Logik im Inneren bleibt aber unter Kontrolle der Klasse.
Was Setter leisten können
- Validierung: Ungültige Werte abfangen, z.B. eine Exception werfen oder den Wert normalisieren.
- Invarianten sichern: Der Setter kann abhängige Felder gleich mitpflegen (z.B. bei einer Namensänderung das Sortierfeld aktualisieren).
- Read-only-Zugriff: Nur ein Getter ohne Setter macht das Feld von außen unveränderlich.
- Debugging: Ein Breakpoint im Setter zeigt, wer den Zustand wann verändert.
- API-Stabilität: Die Methode bleibt stabil, auch wenn sich das interne Feldlayout später ändert.
Wann Getter/Setter unnötig sind
Setter für jedes einzelne Feld zu schreiben, ohne dass Logik dahintersteckt, macht den Code nur lauter — man spricht dann von einem anämischen Datenmodell. Für reine Datentransport-Objekte (DTOs) sind öffentliche Felder oder Konstruktor-Parameter oft ehrlicher. Getter und Setter lohnen sich, wenn Zugriff tatsächlich kontrolliert werden muss: bei Validierung, Unveränderlichkeit oder internen Umrechnungen. In C++ heißen sie üblicherweise Accessoren und arbeiten oft mit Konstanten-Referenzen, um Kopien zu vermeiden.
Verwandte Grundlagen: Objektorientierung, Objekt, Methode, Rückgabewert, Variable.