wake-up-neo.com

Vorteil von set and get-Methoden gegenüber öffentlichen Variablen

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:

  1. getter und Setter können validiert werden In diesen Feldern ist dies nicht möglich
  2. mit Getter können Sie get subclass der gewünschten Klasse.
  3. getter und Setter sind polymorph, Felder nicht
  4. Debugging kann viel einfacher sein, da der Haltepunkt innerhalb einer Methode platziert werden kann, nicht in der Nähe vieler Referenzen des angegebenen Feldes.
  5. sie können Implementierungsänderungen verbergen:

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.

76
dantuch

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

             }
         }
      }
8
  1. Einige Bibliotheken benötigen dies, um den "Java Bean-Standard" zu erfüllen.
  2. Ein Setter/Getter kann sich in einer Schnittstelle befinden, eine Eigenschaft kann sich nicht in einer Schnittstelle befinden
  3. Setter/Getter können in abgeleiteten Klassen leicht überschrieben werden.
  4. setter/Getter abstrahieren die Information, ob ein Wert auf Anfrage oder nur ein Zugriff auf eine Eigenschaft berechnet wird
4
yankee

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 ...

1
Tony Hopkinson