Sichtbarkeit
Einführung
Die Sichtbarkeit (oft auch als Zugriffsmodifikatoren oder Access Modifiers bezeichnet) ist ein grundlegendes Konzept in der objektorientierten Programmierung mit Java. Sie bestimmt, von welchen Stellen im Code auf Klassen, Attribute (Variablen) und Methoden zugegriffen werden kann.
Die korrekte Verwendung von Sichtbarkeiten ist entscheidend für das Prinzip der Datenkapselung (Encapsulation), das sicherstellt, dass die internen Details eines Objekts vor unerwünschten externen Zugriffen geschützt sind.
Die Wahl des richtigen Zugriffsmodifikators ist ein wesentlicher Bestandteil guten Java-Designs:
- Schutz des internen Zustands: Verwenden Sie private für die meisten Attribute.
- Definition der Schnittstelle: Verwenden Sie public für Methoden, die die öffentliche Schnittstelle Ihrer Klasse bilden sollen.
- Erleichterung der Vererbung: Verwenden Sie protected für Elemente, die Unterklassen benötigen, aber nicht von externen Klassen gesehen werden sollen.
- Durch die konsequente Anwendung dieser Regeln stellen Sie sicher, dass Ihr Code wartbar, sicher und leicht verständlich bleibt.
Arten
Modifikator | Sichtbarkeitsebene | Beschreibung |
---|---|---|
public | Überall | Uneingeschränkter Zugriff von jeder Klasse aus, unabhängig vom Paket. (Die breiteste Sichtbarkeit.) |
protected | Innerhalb des Pakets UND in Unterklassen | Zugriff ist erlaubt von jeder Klasse im gleichen Paket oder von jeder Unterklasse (auch wenn diese in einem anderen Paket liegt). |
(Kein Modifikator) | Innerhalb des Pakets (Default / Package-Private) | Der Standard-Zugriff: Nur Code innerhalb des gleichen Pakets kann auf das Element zugreifen. |
private | Nur innerhalb der definierenden Klasse | Der restriktivste Zugriff: Nur Codeinnerhalb der Klasse selbst kann auf das Element zugreifen. (Ermöglicht Kapselung.) |
public (Öffentlich) Verwendung: Für Elemente, die absichtlich eine Schnittstelle nach außen darstellen sollen.
Best Practice: Klassen und Hauptmethoden (wie die main-Methode) sind oft public. Attribute sollten jedoch fast nie public sein, um die Datenkapselung zu gewährleisten. protected (Geschützt) Verwendung: Für Elemente, die zwar nicht von irgendjemandem von außen manipuliert werden sollen, aber für vererbende Klassen (Subclasses) nützlich sind. Es ist ein Kompromiss zwischen public und dem Standard (Package-Private).
Default (Package-Private) Verwendung: Wenn Sie möchten, dass bestimmte Hilfsmethoden oder -variablen nur innerhalb einer Gruppe von eng zusammenarbeitenden Klassen im gleichen Paket verwendet werden können, aber nicht außerhalb.
Hinweis: In der UML-Notation wird dies oft durch das Zeichen ~ (Tilde) dargestellt.
private (Privat) Verwendung: Dies ist der Standard für Attribute (Variablen) innerhalb einer Klasse. Es stellt die stärkste Form der Kapselung dar. Nur Methoden in derselben Klasse können diese Variablen direkt lesen oder ändern.
Regel der Kapselung: Wenn Sie möchten, dass andere Klassen auf private Attribute zugreifen oder diese ändern können, sollten Sie öffentliche Getter- und Setter-Methoden verwenden. Diese Methoden ermöglichen es, den Zugriff zu kontrollieren und Validierungslogik hinzuzufügen.
Attribute (Variablen)→fast immer private Zugriff auf private Attribute→durch public Getter/Setter-Methoden
Beispiel
Stellen wir uns eine Klasse Konto in einem Paket namens bankwesen vor:
package bankwesen;
public class Konto {
// 1. private: Nur innerhalb dieser Klasse zugänglich
private double kontostand = 0.0;
// 2. Default/Package-Private: Nur innerhalb des bankwesen-Pakets zugänglich
String kontoinhaber = "Max Mustermann";
// 3. public: Überall zugänglich
public void einzahlen(double betrag) {
if (betrag > 0) {
this.kontostand += betrag;
}
}
// 4. protected: Innerhalb des bankwesen-Pakets UND in Unterklassen zugänglich
protected double getKontostandIntern() {
return this.kontostand;
}
}