Datenkapselung und Geheimnisprinzip

Warum man das Geheimnisprinzip und die Datenkapselung verstanden haben sollte!

Java ist eine objektorientierte Programmiersprache und im Normalfall wird man je nach Projekt nicht nur mit einer Klasse, sondern mit sehr vielen Klassen arbeiten. Wenn dann am Projekt nicht nur eine Person, sondern eine ganze Gruppe arbeitet, dann müssen im Programm selbst Vorkehrungen getroffen werden um mögliche Fehler schon im Vorhinein auszuschließen. Hilfreich sind dabei die sogenannte Datenkapselung bzw. das Geheimnisprinzip. Was sich hinter diesen beiden Begriffen versteckt und was man bei der Anwendung davon wissen sollte, das erfährt man nachfolgend.

So steht das Geheimnisprinzip dafür, dass man für das Verwenden der Klasse, z.B. durch den Programmierer, so wenig wie möglich wissen muss. Das Innenleben der Klasse ist weitgehend geheim und von außen nicht sichtbar. Der Zugriff von außen funktioniert einzig und allein über Schnittstellen (auch Interfaces genannt), die so wiederum eingesetzt werden um bestimmte Eingaben herauszufiltern. Damit verhindert beispielsweise der Programmierer der Klasse, dass ein anderer Programmierer durch einen Zugriff aus seine Klasse diese so unfreiwillig manipuliert, das es zu Fehlern im Programm kommt.

Mögliche Zugriffsarten bei der Kapselung

Grundsätzlich gibt es die folgenden vier Zugriffsarten (auch Sichtbarkeiten genannt) laut der UML:

  • public (+) - Zugriff von außerhalb und innerhalb der Klasse möglich
  • private (-) - Zugriff nur innerhalb der Klasse möglich
  • protected (#) - Zugriff nur innerhalb der Klasse und von Spezialisierungen derselben
  • package (~) - Zugriff für alle Elemente innerhalb des eigenen Pakets (Anm. für Verwendung in Java: Keine Definition bedeutet Package-Zugriff (Default))

Ein häufiges Szenario mit dem man wahrscheinlich selbst auch konfrontiert werden wird ist, dass die Klassen public sind, während ihre Attribute und Methoden größtenteils private sein werden. Dennoch möchte man natürlich einen Zugriff gestatten, also was tun? Wie schon oben beschrieben, wird man in diesem Fall Schnittstellen zu Verfügung stellen. Bekannte Schnittstellen sind beispielsweise die getter- und setter-Funktionen über die Attribute gesetzt oder ausgelesen werden können. Diese Funktionen müssen dann natürlich zwingenderweise Public sein.

Java Code-Beispiele zur Datenkapselung

private int myAttribute;
public void setMyAttribute(int myAttribute) {
	this.myAttribute = myAttribute;
}

public int getMyAttribute() {
	return this.myAttribute;
}