Was versteht man unter dem Geheimnisprinzip und welche Funktion besitzt es?

Als Geheimnisprinzip wird ein Programmierkonzept bezeichnet, das darauf abzielt, alle Daten so weit wie möglich vor unkontrolliertem Zugriff von außen zu schützen. Es wird durch Datenkapselung realisiert.

In der Objektorientierung ist es ein Gebot von Sicherheit und Stabilität, dass jede einzelne Klasse den Zugriff auf ihre Strukturen nur durch genau definierte Schnittstellen zulässt. Um dies zu erreichen, müssen Methoden und Attribute so weit wie möglich vor unkontrollierten Aufrufen von außerhalb der deklarierenden Klasse geschützt werden. Man spricht auch von einer Einschränkung der Sichtbarkeit der jeweiligen Elemente. Dies geschieht i.a. dadurch, dass Zugriffe auf Methoden und Felder nur für die Bereiche erlaubt werden, die aus programmtechnischen Notwendigkeiten heraus auch wirklich den Zugriff benötigen. D.h., dass z.B. der Aufruf einer Methode aus einer anderen Klasse heraus nur dann erlaubt wird, wenn deren Ausführung an dieser Stelle des Programms auch tatsächlich notwendig ist.

Auf diese Weise wird erreicht, dass eine Klasse nur ein genau definiertes Verwendungsspektrum besitzt und falsche Zugriffe vermieden werden, etwa durch andere Entwickler im Projekt oder bei einer späteren Wiederverwendung der Klasse in einem anderen Kontext.
Geschieht dies nicht, drohen bei der Komplexität moderner, objektorientierter Programme leicht Fehlfunktionen, Programmabstürze oder gar das Einschleusen von Fremdcode, etc.

Java stellt zum Einstellen der Sichtbarkeit drei Zugriffsmodifikatoren bereit, die in der u.a. Tabelle angegeben sind. Die Angabe package-default bezeichnet hierbei die Deklaration von Methoden und Attributen ohne gesondert angegebenen Zugriffsmodifikator.
Für jeden Modifikator ist angegeben in welchen Programmteilen das mit dem Modifikator ausgezeichnete Element sichtbar ist und verwendet werden kann ('x') und in welchen nicht. ('-').

Modifikator Klasse Package Unterklasse global
public x x x x
protected x x x -
packackge-default x x - -
private x - - -

Bsp.: Ist ein Feld mit protected gekennzeichnet, so ist es in der eigenen Klasse, dem eigenen Package und in allen Unterklassen, die von der deklarierenden Klasse abgeleitet wurden sichtbar, nicht jedoch global, d.h. in anderen Packages und Klassen, sofern sie nicht den genannten entsprechen; private erlaubt jeglichen Zugriff nur innerhalb der eigenen Klasse.