Getter und Setter in Java: Wozu braucht man sie eigentlich?

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: „Warum macht man die Felder nicht einfach public?“

\n\n

Stellen Sie sich vor: Sie schreiben eine Klasse Person in Java. Sie hat einen Namen, ein Alter und eine E-Mail. Der einfachste Weg ist, die Felder public zu deklarieren und direkt darauf zuzugreifen:

\n\n
public class Person {\n    public String name;\n    public int age;\n    public String email;\n}
\n\n

„Es funktioniert doch! – werden Sie sagen. – Wozu brauche ich diese Getter und Setter? Nur zusätzlicher Code, die Zeilen werden aufgebläht…“

\n\n

Diese Frage ist eine der beliebtesten auf Stack Overflow. Tausende von Entwicklern, besonders Anfänger, stellen sie sich. Die Antwort, die Sie von einem erfahrenen Java-Programmierer erhalten, ist kurz: Kapselung. Aber hinter diesem Wort verbirgt sich eine ganze Design-Philosophie, die Projekte vor dem Chaos bewahrt.

\n\n

In diesem Artikel geben wir nicht nur eine Definition. Wir analysieren die echten Probleme, die Getter und Setter (auch Accessors und Mutators genannt) lösen, und zeigen dies anhand von lebendigem Code. Los geht‘s!

\n\n

1. Kapselung: Nicht nur ein modisches Wort

\n\n

Kapselung ist ein OOP-Prinzip, das besagt: Verbirg die innere Struktur eines Objekts und stelle eine kontrollierte Schnittstelle für die Interaktion zur Verfügung. Getter und Setter sind genau diese kontrollierte Schnittstelle.

\n\n

Vergleichen Sie die beiden Ansätze:

\n\n

Schlechter Ansatz (public Felder)

\n
Person person = new Person();\nperson.age = -5; // Negatives Alter? Kein Problem!\nperson.email = "not-an-email"; // Müll-Daten werden ohne Prüfung durchgelassen
\n\n

Guter Ansatz (Getter und Setter)

\n
public class Person {\n    private String name;\n    private int age;\n    private String email;\n\n    public int getAge() {\n        return age;\n    }\n\n    public void setAge(int age) {\n        if (age < 0 || age > 150) {\n            throw new IllegalArgumentException("Alter muss zwischen 0 und 150 liegen");\n        }\n        this.age = age;\n    }\n\n    public String getEmail() {\n        return email;\n    }\n\n    public void setEmail(String email) {\n        if (email == null || !email.contains("@")) {\n            throw new IllegalArgumentException("Ungültige E-Mail");\n        }\n        this.email = email;\n    }\n\n    // restliche Getter/Setter...\n}
\n\n

Wenn jetzt jemand versucht, das Alter auf -5 zu setzen, wirft das Programm eine Ausnahme. Die Daten sind geschützt. Das ist die Macht der Kapselung.

\n\n

2. Datenvalidierung im laufenden Betrieb

\n\n

Setter sind der ideale Ort, um Eingabedaten zu prüfen. Ohne sie müssten Sie die Validierung an jeder Stelle schreiben, an der Sie einen Wert zuweisen. Das führt zu Code-Duplizierung und dem Risiko, die Prüfung irgendwo zu vergessen.

\n\n

Beispiel mit einem Bankkonto:

\n\n
public class BankAccount {\n    private double balance;\n\n    public double getBalance() {\n        return balance;\n    }\n\n    public void deposit(double amount) {\n        if (amount <= 0) {\n            throw new IllegalArgumentException("Der Einzahlungsbetrag muss positiv sein");\n        }\n        this.balance += amount;\n    }\n\n    public void withdraw(double amount) {\n        if (amount <= 0) {\n            throw new IllegalArgumentException("Der Abhebungsbetrag muss positiv sein");\n        }\n        if (amount > balance) {\n            throw new IllegalStateException("Nicht genügend Guthaben");\n        }\n        this.balance -= amount;\n    }\n}
\n\n

Beachten Sie: Es gibt hier keinen direkten Setter für balance. Wir verwalten den Kontostand über die Methoden deposit und withdraw, die bereits die gesamte Prüflogik enthalten. Der Getter gibt einfach den aktuellen Zustand zurück.

\n\n

3. Flexibilität: Sie können die Implementierung ändern, ohne den Code zu brechen

\n\n

Stellen Sie sich vor, Sie speichern das Alter in einem int-Feld und entscheiden sich dann, das Geburtsdatum zu speichern und das Alter dynamisch zu berechnen. Wenn Sie

Blogs

Buchempfehlungen