Wir haben etwas zu verbergen
Eine Klasse sollte nur so viel offen darlegen, wie für die Nutzer der Klasse unbedingt erforderlich. Alles was in der Klasse verborgen ist, kann später ohne Auswirkung auf andere Klassen verändert werden.private vermeidet aufwändige Neuberechnung
Im Beispiel wird der Wochentag nur neu berechnet, wenn dies erforderlich ist.public class Datum { private int tag, monat, jahr, wochentag=-1; public int getWochentag() { if (wochentag<0) { wochentag = berechneWochentag(); } return wochentag; } ... public setTag(int tag) { this.tag = tag; wochentag = -1; } }
Setter und Getter
Es gilt die Regel, dass Attribute niemals public sein sollten, sondern über get- und set-Methoden gelesen oder geschrieben werden. Auf diesem Wege ist es möglich, Read-Only-Attribute zu sichern.Klassen, die nur aus Attributen, Gettern und Settern und eventuellen Konstruktoren bestehen, bezeichnet man als Java Beans oder POJO.
class MeineBean { private int meinAttribut; // Attribut public int getMeinAttribut() { // Getter return this.meinAttribut; } public void setMeinAttribut(int neu) { // Setter this.meinAttribut = neu; } }Eclipse unterstützt dies durch Rechtsklick in den Quelltext. Aus dem Menü wählt man Source|Create Getters and Setters. Im folgenden Dialog kann man auswählen, welche Attribute mit Gettern und Settern versehen werden sollen.
class Datum { private int tag; void setTag(int paraTag) { tag = paraTag; } int getTag() { return tag; } ... }
Dieses etwas umständliche Vorgehen sichert der Klasse die Kontrolle über die Attribute. Später einmal kann es erforderlich sein, zu prüfen, ob der Tag wirklich im Bereich von 1 bis 31 ist. Vielleicht will man auch sicherstellen, dass niemand den 30. Februar erfindet. Dazu müssen in den Setter-Methoden entsprechende Prüfungen eingebaut werden.
Kein Modifizierer oder protected
Wird kein private oder public vorangestellt, ist das entsprechende Element für das gesamte Package sichtbar.Java verfügt neben public und private auch über das Schlüsselwort protected, das unter C++ nur erweiternden Klassen den Zugriff einräumt.
Allerdings verwendet Java das Schlüsselwort in einer völlig anderen Semantik. Aus der Java-Dokumentation wird klar, dass protected nicht nur dem Package einräumt, sondern darüber hinaus auch anderen Klassen anderer Packages, die die Klasse erweitern.
- public: zugreifbar für alle Objekte (auch die anderer Klassen)
- private: nur für Objekte der eigenen Klasse (this) zugreifbar
- Ohne Angabe kann nur ein Objekte des eigenen Packages zugreifen.
- protected: alle Objekte des eigenen Packages und darüber hinaus alle Objekte der abgeleiteten Klassen,