Datenkapselung (engl. ecapsulation) bezeichnet in der Informatik das bewusste Verbergen von Daten vor dem Zugriff von außen. Der direkte Zugriff auf die interne Datenstruktur wird dabei unterbunden und der Zugriff von außen durch eine Schnittstelle implementiert.
Erklärung
Daten sind ein sensibles Thema. Niemand gibt diese gerne unkontrolliert frei. So hast du sicher auch schon einmal bei Social-Media oder anderen Plattformen eingestellt, wer deine Daten sehen darf oder nicht. Oft wird dabei in den Kategorien öffentlich, nur Freunde oder nur du unterschieden.
Sichtbarkeitsmodifikatoren gibt es in Java jedoch nicht nur für Daten, also Variablen. Sie existieren auch für Klassen, Methoden und andere Strukturen und bestimmen, wie andere Klassen/Objekte darauf zugreifen dürfen.
public
Der Sichtbarkeitsmodifikator public bedeutet, dass jede andere Klasse (und daraus resultierend jedes andere Objekt) vollumfänglich darauf zugreifen darf.
Betrachte folgende vereinfachte Version der Java-Klasse Person
:
Besuche die App, um alle Inhalte zu sehen!
Dabei sind die Variablen name
und age
auf public
gesetzt. Das bedeutet, dass jedes andere Objekt beliebig darauf zugreifen und diese verändern dürfte. Jedes Objekt könnte später dann Jans Namen ändern.
Du kannst dir das Ganze also wie eine Bibliothek vorstellen, in die jede und jeder rein darf. Es gibt keinerlei Kontrollen und diese ist offen für alle.
protected
Der Sichtbarkeitsmodifikator protected bedeutet, dass nur Klassen aus demselben Package darauf zugreifen können.
Ein Package ist dabei eine Art Gruppe, die aus mehreren Klassen besteht. Die Klassen werden darin zusammengefasst, weil sie logisch verbunden sind. Du kannst dir das Ganze wie einen Ordner oder eine Box vorstellen. Deine Schulunterlagen aus Mathe sind in deinem Mathe-Ordner. Die aus dem Fach Deutsch im Deutsch-Ordner.
Besuche die App, um alle Inhalte zu sehen!
Das heißt, dass jedes Objekt später auf den Namen von Jan direkt zugreifen kann, deren Klassen im selben Package wie die Klasse Person liegt.
Um wieder zum Beispiel zurückzukommen: Jan möchte dieses Mal auf eine Party gehen. Vor dem Club gibt es aber einen Türsteher, der verhindert, dass jeder hinein darf. Auf Attribut oder Methode kann nur von Klassen innerhalb des gleichen Package zugriffen werden. Dieses Package entspricht dem gleichen Freundeskreis. Jan darf also in den Club, weil heute hier sein Freundeskreis feiert. Außenstehende Personen würde der Türsteher aber abweisen.
private
Der Sichtbarkeitsmodifikator private bedeutet, dass kein Zugriff von außerhalb erfolgen kann. Auf Attribute oder Methoden mit dem Modifikator private kann nur innerhalb der Klasse zugegriffen werden.
Der Sichtbarkeitsmodifikator private
ist der strengste Modifikator. Er erlaubt den Zugriff nur innerhalb derselben Klasse. Von außen kann auf private
-Attribute/-Methoden nicht zugegriffen werden.
Besuche die App, um alle Inhalte zu sehen!
Das heißt, dass kein Objekt von außerhalb direkt auf die Variable name
zugreifen kann. Der Name von Jan kann also nicht von außen unbefugterweise verändert werden.
Im Club-Beispiel würde dies bedeuten, dass Jan dieses Mal nicht rein darf. Der Türsteher lehnt konsequent jeden Zugriff von außen ab.
Set- und Get-Methoden
Durch protected
oder private
wird der Zugriff auf Attribute stark eingeschränkt. Oft will man jedoch trotzdem nach den Werten solcher Attribute fragen oder diese in speziellen Fällen sogar verändern. Daher implementiert man ein Interface, welches den Zugriff steuert. Von außen ist dann das Attribut nie direkt zu sehen, sondern es erfolgt der Zugriff über Set- und Get-Methoden:
Besuche die App, um alle Inhalte zu sehen!
Durch ...
public String getName()
kann jedes Objekt von außen den ersten Namen abfragen. Da firstName
und secondName
jedoch private
sind, können diese Namen nach der Initialisierung des Objektes durch den Konstruktor nicht mehr geändert werden.
protected void setNickname(String nickname)
kann der Freundeskreis dem Objekt einen Spitznamen geben. Dieser kann sich mehrfach ändern, daher ergibt es Sinn, den Zugriff auf die engere Umgebung (protected
) zu beschränken.
protected String getNickname()
kann der engere Freundeskreis den Spitznamen abfragen. Der Zugriff von außen auf den Spitznamen durch jeden ist aber geschützt.
Wie du sicher bemerkt hast, sind weiterhin alle Attribute private
. Es ist guter Stil, Attribute private
zu setzen und den Zugriff, sei er noch so simple, immer über Get- und Set-Methoden zu regeln.
Side Fact
Wenn du in Java keinen Sichtbarkeitsmodifikator direkt angibst, wird automatisch eine Art Mittelding zwischen private
und protected
verwendet.
Dieses solltest du jedoch nicht verwenden. Es ist besser, sich immer aktiv klarzumachen, welche Elemente direkten Zugriff haben sollen und welche Elemente nur über ein Interface zugreifbar sein sollen.