Einleitung: „Warum macht man die Felder nicht einfach public?“
\n\nStellen 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:
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\nDiese 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\nIn 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\n1. Kapselung: Nicht nur ein modisches Wort
\n\nKapselung 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\nVergleichen Sie die beiden Ansätze:
\n\nSchlechter Ansatz (public Felder)
\nPerson person = new Person();\nperson.age = -5; // Negatives Alter? Kein Problem!\nperson.email = "not-an-email"; // Müll-Daten werden ohne Prüfung durchgelassen\n\nGuter Ansatz (Getter und Setter)
\npublic 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\nWenn 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\n2. Datenvalidierung im laufenden Betrieb
\n\nSetter 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\nBeispiel mit einem Bankkonto:
\n\npublic 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\nBeachten 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.
3. Flexibilität: Sie können die Implementierung ändern, ohne den Code zu brechen
\n\nStellen 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
Lesen Sie auch
Logging in Java-Anwendungen: Best Practices und Tools
$(document).ready ohne jQuery: moderne Alternativen im Jahr 2025
Funktionale Programmierung in PHP: Fortgeschrittenes Niveau
Seltsame Klammern vor dem Funktionsnamen in Go: Eine Analyse
Clean Code in PHP: Prinzipien für sauberen Code mit Beispielen