2012-06-17 9 views
29

Mögliche Duplizieren:
Why use getters and setters?Vorteil von Set und erhalten Methoden vs öffentliche Variable

Gibt es einen Vorteil Methoden zur Herstellung von privaten Variablen in der Klasse zuzugreifen anstatt die Variable öffentlich ?

Zum Beispiel ist 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; 
    } 

} 
+0

mögliche Duplikate von [Warum Getter und Setter verwenden?] (Http://StackOverflow.com/questions/1568091/why-use-getters-and-setters) und [Auto-implementierte Getter und Setter vs. öffentliche Felder] (http://stackoverflow.com/questions/111461) –

Antwort

59

Was ich einen Tag auf SO gesehen, als Antwort (geschrieben von @ ChssPly76) warum Getter und Setter verwenden

Da 2 Wochen (Monate, Jahre) ab jetzt, wenn Sie feststellen, dass Ihre Setter muss mehr tun, als nur den Wert eingestellt, können Sie auch erkennen werden, dass die Immobilie wurde :-)

gibt es viel mehr Vorteile direkt in 238 anderen Klassen verwendet:

  1. Getter und Setter können Validierungs in ihnen haben, können Felder nicht
  2. Sie mit Getter Unterklasse gesuchter Klasse erhalten können.
  3. Getter und Setter ist polymorph, Felder sind nicht
  4. Debuggen kann viel einfacher sein, weil Haltepunkt in einem Verfahren nicht in der Nähe von vielen Referenzen von diesem bestimmten Bereich platziert werden kann.
  5. sie können ausblenden Implementierung ändert:

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: eine weitere neue advange wenn Verwendung von Eclipse - Sie kann Watchpoint auf Feld erstellen, aber wenn Sie Setter haben, müssen Sie nur ein Haltepunkt und ... Haltepunkte (z.B. in Setter-Methode) kann bedingt sein, Watchpoints (auf Feld) kann nicht. Also, wenn Sie Ihren Debugger nur stoppen wollen, wenn x=10 Sie es nur mit Haltepunkt innerhalb Setter tun können.

+0

Getters und Setter die guten Teile (http://pawel-michalski-javnie.blogspot.de/2012 /04/gettery-settery-enkapsulacja-czy.html) nicht lustig überhaupt ... warum gib es einen englischen Titel und fahre mit etwas komischer Sprache fort ... –

+1

@MatthisKohli Sorry, du hast Recht. Ich habe diesen Link entfernt. – dantuch

4
  1. Einige Bibliotheken benötigen dies, um den "Java Bean Standard" zu erfüllen.
  2. Ein Setter/Getter kann in einer Schnittstelle sein, eine Eigenschaft kann nicht in einer Schnittstelle sein
  3. Setter/Getter können in absteigenden Klassen leicht überschrieben werden.
  4. Setter/Getter abstrahieren die Information, ob ein Wert auf Anforderung oder nur ein Accessor eine
Eigenschaft berechnet
6

öffentlichen Variable verwenden kann Einstellung falsche Werte an die Variable bewirken, da der Eingangswert nicht geprüft werden kann .

zB:

public class A{ 

    public int x; // Value can be directly assigned to x without checking. 

    } 

Setter verwenden können die Variable mit Überprüfung der Eingangs eingestellt werden. die Instanz zu halten Varibale private und Getter und Setter Öffentlichkeit ist eine Form von Encapsulation Getter und Setter ist auch kompatibel mit Java Beans Standard,

Getter und Setter auch helfen in Polymorphismus Konzept Umsetzung

zB:

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; 
     } 

Polymorphe Beispiel: Wir ASSIG können n Object Reference Variable des Subtyps als Argument vom Aufruf der Methode zur Object Reference-Variablen des Super Class-Parameters der Called-Methode.

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"); 

      } 
     } 
     } 
0

Etwas zurückblickende Dinge.

Gibt es irgendwelche Umstände, wo es besser ist, das Innenleben Ihrer Klasse zu offenbaren, indem Sie eine Membervariable öffentlich machen, damit jeder Verbraucher Dinge tun kann, von denen der Designer nie überzeugt war, was zu einem Fest des Scheiterns und einer Fülle von stürzt ab?

Art von Antworten sich wirklich, dass man es nicht tut?

Cornerstone-Prinzip von OO, Verkapselung. Eine öffentliche Membervariable ist im Grunde globale Variable mit einem Präfix ...

+4

Es gibt gute Gründe, keine Getter und Setter zu verwenden - sie machen den Code unübersichtlich, erschweren das Lesen und verletzen das DRY-Prinzip. Tatsächlich ist es in Sprachen mit Eigenschaften üblich, Dinge nur öffentlich zu machen (da sie später in Eigenschaften umgestaltet werden können, wenn es wirklich notwendig ist). – Antimony

+0

@Antimony. Nicht der Ort für eine Debatte, aber ich kann nicht zustimmen, nicht einmal ein kleines bisschen. Ich habe gesehen, viel zu viele Instanzen waren diese Art 'Erm-Verknüpfung, hat viel mehr Arbeit als nur Refactoring auf eine Eigenschaft verursacht. Viel viel mehr. –