web-dev-qa-db-fra.com

Avantage des méthodes set et get vs variable publique

Duplicata possible:
Pourquoi utiliser des getters et setters?

Y a-t-il un avantage à rendre les méthodes pour accéder aux variables privées dans votre classe au lieu de rendre la variable publique?

Par exemple, le deuxième cas est-il meilleur que le premier?

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

}

Ce que j'ai vu un jour sur SO, comme réponse (écrit par @ ChssPly76) pourquoi utiliser des getters et setters

Parce que dans 2 semaines (mois, années) à partir de maintenant, lorsque vous réaliserez que votre setter doit faire plus que simplement définir la valeur, vous vous rendrez également compte que la propriété a été utilisée directement dans 238 autres classes :-)

il y a bien plus d'avantages:

  1. getters et setter peut avoir une validation en eux, les champs ne peuvent pas
  2. en utilisant getter, vous pouvez obtenir la sous-classe de la classe souhaitée.
  3. getters et setters sont polymorphes, les champs ne sont pas
  4. débogage peut être beaucoup plus simple, car le point d'arrêt peut être placé dans une méthode pas près de nombreuses références de ce champ donné.
  5. ils peuvent masquer les changements d'implémentation:

avant:

private boolean alive = true;

public boolean isAlive() { return alive; }
public void setAlive(boolean alive) { this.alive = alive; }

après:

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 : un nouveau advange supplémentaire lorsque vous utilisez Eclipse - vous pouvez créer un point de surveillance sur le terrain, mais si vous avez un setter, vous avez juste besoin d'un point d'arrêt, et .. . les points d'arrêt (par exemple dans la méthode de définition) peuvent être conditionnels, les points d'observation (sur le terrain) ne peuvent pas. Donc, si vous souhaitez arrêter votre débogueur uniquement si x=10 vous ne pouvez le faire qu'avec un point d'arrêt à l'intérieur du setter.

76
dantuch

L'utilisation de la variable publique peut entraîner la définition de valeurs incorrectes pour la variable comme la valeur d'entrée ne peut pas être vérifiée.

par exemple:

 public class A{

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

   }

L'utilisation de setter peut être utilisée pour définir la variable avec vérification de l'entrée. Garder l'instance varibale privée, et getter et setter public est une forme de Encapsulation getter et setter est également compatible avec Java Beans standard,

getter et setter aide également à implémentation du concept de polymorphisme

par exemple:

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

Exemple polymorphe: Nous pouvons affecter la variable de référence d'objet du type Sub comme argument de la méthode d'appel à la variable de référence d'objet du paramètre de super classe de la méthode appelée.

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
Kumar Vivek Mitra
  1. Certaines bibliothèques en ont besoin pour respecter le "standard Java Bean".
  2. Un setter/getter peut être dans une interface, une propriété ne peut pas être dans une interface
  3. Les setters/getters peuvent facilement être remplacés dans les classes descendantes.
  4. les setters/getters résument les informations, qu'une valeur soit calculée à la demande ou simplement un accesseur à une propriété
4
yankee

Une façon un peu en arrière de voir les choses.

Y a-t-il des circonstances où il est préférable d'exposer le fonctionnement interne de votre classe en rendant public une variable membre, afin que tout consommateur puisse faire des choses que le concepteur n'a jamais imaginées, conduisant à un festin d'échec et à une corne d'abondance d'accidents?

Sorte de réponse elle-même vraiment que l'on ne fait pas?

Principe fondamental de l'OO, encapsulation. Une variable membre publique est essentiellement une variable globale avec un préfixe ...

1
Tony Hopkinson