Mögliches Duplikat:
Warum Getter und Setter?
Hat es einen Vorteil, Methoden für den Zugriff auf private Variablen in Ihrer Klasse festzulegen, anstatt die Variable öffentlich zu machen?
Ist zum Beispiel der zweite Fall besser als der erste?
//Case 1
public class Shoe{
public int size;
}
//Case 2
public class Shoe{
private int size;
public int getSize(){
return size;
}
public void setSize(int sz){
size = sz;
}
}
Was ich eines Tages auf SO gesehen habe, als Antwort (geschrieben von @ ChssPly76), warum man Getter und Setter verwendet
Da Sie in zwei Wochen (Monaten, Jahren) feststellen, dass Ihr Setter mehr tun muss als nur den Wert festzulegen, werden Sie auch feststellen, dass die Eigenschaft direkt in 238 anderen Klassen verwendet wurde :-)
es gibt viel mehr vorteile:
vor:
private boolean alive = true;
public boolean isAlive() { return alive; }
public void setAlive(boolean alive) { this.alive = alive; }
nach:
private int hp; // change!
public boolean isAlive() { return hp > 0; } // old signature
//method looks the same, no change in client code
public void setAlive(boolean alive) { this.hp = alive ? 100 : 0; }
EDIT : ein zusätzlicher neuer Vorteil bei der Verwendung von Eclipse - Sie können einen Überwachungspunkt auf dem Feld erstellen, aber wenn Sie einen Setter haben, brauchen Sie nur einen Haltepunkt und .. Haltepunkte (zB in der Setter-Methode) können bedingt sein, Watchpoints (auf dem Feld) nicht. Also, wenn Sie Ihren Debugger nur stoppen wollen, wenn x=10
Sie können dies nur mit einem Haltepunkt im Setter tun.
Die Verwendung einer öffentlichen Variablen kann dazu führen, dass falsche Werte für die Variable festgelegt werden, da der Eingabewert kann nicht überprüft werden.
z.B:
public class A{
public int x; // Value can be directly assigned to x without checking.
}
Mit setter kann die Variable mit Eingabe prüfen gesetzt werden. Die Instanz varibale privat zu halten und Getter und Setter öffentlich zu machen, ist eine Form von Encapsulation Getter und Setter ist auch kompatibel mit Java-Beans-Standard,
getter und Setter helfen auch bei Implementierung des Polymorphismus-Konzepts
z.B:
public class A{
private int x; //
public void setX(int x){
if (x>0){ // Checking of Value
this.x = x;
}
else{
System.out.println("Input invalid");
}
}
public int getX(){
return this.x;
}
Polymorphes Beispiel: Wir können der Objektreferenzvariablen des Superklassenparameters der aufgerufenen Methode die Objektreferenzvariable des Subtyps als Argument der aufrufenden Methode zuweisen.
public class Animal{
public void setSound(Animal a) {
if (a instanceof Dog) { // Checking animal type
System.out.println("Bark");
}
else if (a instanceof Cat) { // Checking animal type
System.out.println("Meowww");
}
}
}
Etwas rückwärts gerichtete Betrachtungsweise.
Gibt es Umstände, unter denen es besser ist, das Innenleben Ihrer Klasse durch die Veröffentlichung einer Mitgliedervariablen aufzudecken, sodass jeder Konsument Dinge tun kann, die der Designer nie gedacht hat, was zu einem Fest des Scheiterns und einer Fülle von Abstürzen führt?
Art von Antworten selbst wirklich, dass man es nicht tut?
Eckpfeiler der OO, Kapselung. Eine öffentliche Mitgliedsvariable ist im Grunde eine globale Variable mit einem Präfix ...