Jedes Attribut einer Klasse und jede Methode kann eine der Eigenschaften
public oder private erhalten. Hat sie keine davon, gilt sie
standardmäßig als public.
public: ja
private: nein
Das bedeutet, dass Attribute, die public sind, im konkreten
Programmablauf bsp. in einer main-Methode, ausgelesen und geschreiben
werden können - mit allen Konsequenzen, die dahinter stecken. So könnten
Werte eingetragen werden, die ich als Programmierer gar nicht zulassen
möchte, bsp. einen positives Dispo-Wert in einer Klasse Konto.
public class Konto {
String inhaber;
double guthaben;
double dispo;
...
}
public class Main {
public static void main(String[] args) {
Konto giro = new Konto();
giro.inhaber = "Homer";
giro.dispo = 1000;
...
}
}
Hier wird in der Main-Klasse ein Wert für Dispo eingetragen, der
nicht zulässig ist. Wie kann man solch unerwünschtes Zugreifen auf
Attribute verhindern?
Wenn ich selbst bestimmen möchte, wie auf bestimmte Attribute
zugegriffen wird, muss ich das Attribut nach außen schützen, indem ich
es auf private setze. Damit geht jeder Zugriff nach außen verloren.
Probiere das Beispiel aus, indem das Attribut dispo das Schlüsselwort
private vorangestellt wird. Du wirst sehen, dass es in der Main eine
Fehlermeldung gibt. Schon ein Text-Editor mit Java-Extension wird sich
über nicht Nicht-Sichtbarkeit beschweren.
public class Konto {
String inhaber;
double guthaben;
private double dispo;
...
}
public class Main {
public static void main(String[] args) {
Konto giro = new Konto();
giro.inhaber = "Homer";
giro.dispo = 1000;
...
}
}
Nun wäre es ein ziemlich sinnloses Programm, wenn ich bestimmte
Attribute im Programmablauf nicht verändern könnte. Als Programmierer
möchte ich ja, dass Attribute ja nach Objekt unterschiedlich sein
können. Ich möchte das aber eben nach meinen eigenen Bedingungen!
Hier kommt das Konzept der sogenannten Getter und
Setter-Methoden zum Tragen.
Statt dass ich das Attribut public mache, biete ich eine Methode
öffentlich (public) an, die das Setzen (Set) oder Auslesen (Get) von
Attributen übernimmt.
Was ist nun der große Unterschied zum direkten Bearbeiten?
Ich kann in den Getter und Setter-Methoden meinen eigenen
Bedingungen implementieren! So kann ich für das Beispiel des Kontos
festlegen, dass ein Attribut dispo niemals positiv sein darf. Ich als
Programmierer erlange somit Kontrolle über mögliche Werte von
Attributen!
public class Konto {
String inhaber;
double guthaben;
private double dispo;
public void setDispo(int x){
if (x > 0){
this.dispo = -1 * x;
}
else{
this.dispo = x;
}
}
...
}
public class Main {
public static void main(String[] args) {
Konto giro = new Konto();
giro.inhaber = "Homer";
giro.setDispo(1000);
...
}
}