Warum Instanzvariablen private deklarieren?
Oft sieht man hier im Forum Code in dem Instanzvariablen public deklariert sind. Warum man das nicht tun soll, wird hier nun erklärt:
Man deklariert Instanzvariablen aus drei Gründen nie als public:
1. Schnittstellen Definitionen: Stellt euch vor ihr habt eine Klasse die z.b. eine Map Struktur als Instanzvariable hat. Der User soll etwas in diese Map eintragen können und sich Werte holen. Ist diese Map nun als private deklariert könnt ihr diese Anforderungen durch zwei einfache setValue und getValue methoden realisieren und ihr habt keinerlei Probleme. Ist diese Map aber als public definiert, so kann man von außen ohne Probleme auf diese Map zugreifen und u.a. Werte aus der Map löschen oder sogar die Map komplett löschen, was möglicherweise zu Fehlern im Programm führt.
Anderes Beispiel: Ihr habt eine Klasse die eine mathematische Funktion darstellt, die nur im positiven Bereich definiert ist. Wenn ihr nun eine private Instanzvariable habt könnt ihr z.b. bei der set-Methode der Variable testen ob diese auch positiv ist (und wenn nicht eine Exception werfen). Ist sie hingegen als public definiert, so kann man jeden beliebigen Wert setzen, ohne dass eine Kontrollmöglichkeit besteht.
2. Flexibiltät: Nehmen wir wieder das Beispiel der Map Struktur von oben. Stellt euch vor, nach längere Programmierzeit stellt ihr fest, dass die von euch gewählte Map Struktur leider nicht die richtig ist und ihr sie ändern müsst. Ist sie nun als private deklariert und nur mit den zwei oben beschriebenen Methoden zugänglich, so müsst ihr nur diese beiden Methoden anpassen und das Programm läuft weiterhin. Ist sie aber als public deklariert, müsst ihr im kompletten Programm suchen, wo ihr auf diese Struktur zugreift und den Code auch dort anpassen.
3. Unabhängigkeit: Basiert stark auf Punkt 2 und ist eine kleine Erweiterung. Ein optimales Progamm trennt zwischen Modell (also die Klasse die die Daten hält - in dem Fall die mit der Map) und Nutzen der Daten bzw. Visualisierung der Daten. D.h. optimal wäre, wenn die außen stehenden Klassen die bestehende Struktur des Datenmodells gar nicht kennen (sie müssen nicht wissen wie die Daten gespeichert sind, sondern nur wie sie an sie rankommen). Hier gilt die gleiche Argumentation wie oben. Ist die Map struktur als private deklariert, läuft man kein Problem dieses Paradigma zu verletzen, da man nur über die gewählten Schnittstellen an die Struktur kommt. Ist die Struktur aber als public deklariert, so ist das Paradigma eindeutig verletzt!
Daher: Instanzvariablen IMMER als private deklarieren! Ausnahmen: 1. Konstanten können als public deklariert werden, wenn sie Informationen bereit stellen die auch von anderen Klassen gebraucht werden. 2. Instanzvariablen in einer Superklasse können als protected deklariert sein, so dass erbende Klassen auf diese Variablen direkt zugreifen können.
-- bygones 05.05.2004