Sichtbarkeit
🚧 | Diese Seite befindet sich in Bearbeitung | 🚧 |
🤓 | Diese Seite ist eine Bewertungsrichtlinie, die ab Blatt 2 annotiert und ab Blatt 3 abgezogen wird. | 🤓 |
Beschreibung
In der Objektorientierten Programmierung spielt die Sichtbarkeit als Thema eine große Rolle. Schauen wir uns erst einmal die Modifikatoren und dann die verschiedenen Anwendungsbereiche an.
Modifikatoren:
Mit Sichtbarkeiten werden Attribute, Methoden und Konstruktoren einer Klasse vor ungewollten Zugriffen von außerhalb der Klasse geschützt. Damit kann jede Klasse kontrollieren, welche elemente für andere Klassen sichtbar (und damit aufrufbar bzw. überschreibbar) sind. Die folgende Tabelle zeigt die vier möglichen Sichtbarkeiten:
Modifikator | Klasse | Paket | Unterklasse | Alle |
---|---|---|---|---|
public | Ja | Ja | Ja | Ja |
protected | Ja | Ja | Ja | Nein |
<default> | Ja | Ja | Nein | Nein |
private | Ja | Nein | Nein | Nein |
Generell gilt:
Sichtbarkeiten sollten immer möglichst niedrig gewählt werden. Es ist praktisch nicht möglich, die Sichtbarkeit zu niedrig zu wählen, da dann das Programm nicht mehr kompiliert. Übliche herangehensweise ist, alles erst einmal private zu markieren und nach und nach die Sichtbarkeit etwas zu "lockern".
Sichtbarkeit von Attributen:
Attribute sollten immer private sein. Falls eine andere Klasse das Attribut lesen muss, sollte eine sogenante Getter-Methode verwendet werden. Muss der Wert verändert werden, sollte eine Setter-Methode verwendet werden. In manchen Fällen müssen Unterklassen auf die Attribute ihrer Oberklasse zugreifen. Generell sollte dieser Fall vermieden werden bzw. falls möglich vorhandene Getter und Setter verwendet werden. Ist der Zugriff dennoch nötig, so kann das Attribut auf protected gesetzt werden.
Sichtbarkeit von Methoden:
Methoden, die nur innerhalb einer Klasse verwendet werden, müssen immer private sein. Gehört die Methode zu einer öffentlichen Schnittstelle einer Klasse (also soll von außerhalb der Klasse aufgerufen werden), so sollte sie public sein. Es ist selten sinnvoll, Methoden als protected oder package-private (d.h. ohne Modificator) zu definieren. Der Modifikator public ist meist ausreichend.
Sichtbarkeit von Konstruktoren:
Konstruktoren sind in den meisten Fällen public, schließlich sollen andere Klassen diese Klasse instanziieren können. Es gibt allerdings einige Ausnahmen:
- Utility-Klassen (Hilfsklassen) sollen nicht instanziiert werden können und haben deshalb ausschließlich private Konstruktoren
- Hilfskonstruktoren, die von anderen Konstruktoren aufgerufen werden (mit this(...)), selbst aber niemals von außerhalb aufgerufen werden sollen, sollten private sein
- Konstruktoren von abstrakten Klassen können protected sein, da diese in jedem Fall nur von Unterklassen aufgerufen werden (mit super(...))
Die Standard-Sichtbarkeit (package-private) ist in der Regel nciht zu verwenden, da sie nur in bestimmten Fällen sinnvoll ist. Sollte die Sichtbarkeit explizit so gewählt worden sein, sollte die Wahl entsprechend Dokumentiert werden, da sonst die absichtliche Wahl mit einem vergessen der Sichtbarkeit verwechselt werden kann.
Negativbeispiel
public final class Book {
public String title;
long isbn;
protected Book(String title, long isbn) { // protected ist hier sinnlos, da die Klasse final ist - es gibt keine Unterklassen
if (!isIsbnValid(isbn)) {
throw new InvalidIsbnException("The isbn is not valid");
}
this.title = title;
this.isbn = isbn;
}
public boolean isIsbnValid(long isbn) { // isIsbnValid ist eine Hilfsmethode und sollte nicht außerhalb der Klasse verwendet werden
// ...
}
}
Positivbeispiel
public final class Book {
private String title;
private long isbn;
public Book(String title, long isbn) {
if (!isIsbnValid(isbn)) {
throw new InvalidIsbnException("The isbn is not valid");
}
this.title = title;
this.isbn = isbn;
}
public String getTitle() {
return this.title;
}
public long getIsbn() {
return this.isbn;
}
private boolean isIsbnValid(long isbn) {
// ...
}
}
Wenn du diese Seite interessant fandest, findest du hier noch mehr Seite(n) dazu:
Geheimnisverrat