Conventions Java: utiliser des getters / setters dans la classe?

mon professeur insiste vraiment sur la protection contre les fuites de confidentialité en utilisant toujours les accesseurs et les mutateurs pour accéder aux variables d'instance privée; cependant, dois-je utiliser les getters/setters d'une classe de la classe?

Donc par exemple, si j'ai la classe suivante:

public class Person 
{
    private String name;
    private int age;
}

et je veux écrire une méthode toString() pour cela. Puis-je simplement écrire:

public String toString()
{
    return name + " " + age;
}

OU dois-je besoin de faire quelque chose comme ceci:

public String toString()
{
    return this.getName() + " " + this.getAge();
}
43
demandé sur chance 2011-12-11 23:29:55

11 réponses

vous pouvez faire l'un ou l'autre. Cependant, votre professeur pourrait apprécier d'utiliser les méthodes au lieu de l'accès direct. Voici pourquoi.

disons que vous avez une classe comme ceci:

class SomeClass {
    private int someValue;
    private String someString;

    public SomeClass(int someValue, String someString) {
        this.someValue = someValue;
        this.someString = someString;
    }

    public int someValue() {
        return someValue;
    }

    public int someString() {
        return someString;
    }

    public String toString() {
        return someValue + ": " + someString;
    }

}

C'est assez simple, non? Eh bien, que faire si tout d'un coup nous voulons changer la mise en œuvre de la façon dont nous calculons someValue, et elle hors de la base de someString:

public int someValue() {
    int value = 0;
    for(int i = 0; i < someString.length; i++) {
         if(someString.charAt(i) == ' ') value++;
    }
    return value;
}

Maintenant vous devez aussi changer chaque endroit où variable someValue a été utilisé.

Donc si vous voulez rendre le code plus facile à maintenir dans le long terme, utiliser les appels de méthodes. De cette façon, lorsque vous changez de code sur vous (et croyez-moi, cela change tout le temps), vous n'avez qu'à le changer en un seul endroit au lieu de deux.

Et oui, vous pouvez utiliser un appel de méthode à obtenir someString au lieu de l'accès direct dans la dernière méthode :-)

34
répondu corsiKa 2016-03-11 13:15:22

Quand je crée une classe, j'essaie de faire une distinction claire entre l'intérieur (détails de mise en œuvre) et l'extérieur (l'interface exposée au monde). Getters et setters fournissent un endroit commode pour convertir des valeurs entre la forme dans laquelle ils sont stockés dans les membres d'instance de l'objet et la forme dans laquelle le monde extérieur les voit. L'utilisation de getters et de setters à l'interne pourrait brouiller cela, parce qu'ils seraient utilisés à la fois à l'intérieur et à l'extérieur.

Si vous surprendrez à vouloir cacher une partie d'une classe par une autre partie de la même classe, envisager la rupture de la partie que vous voulez cacher dans sa propre classe.

15
répondu Nathan Hughes 2017-11-29 18:51:04

Il n'est normalement pas une bonne idée, pour plusieurs raisons:

  • vous ne pouvez même pas vouloir des accesseurs pour tous les champs
  • certains accesseurs peuvent faire une copie défensive donc pour ne pas exposer l'état interne, ceci est normalement inutile dans la classe où vous savez que vous n'allez pas le modifier - ou tout simplement mal si vous savez que vous allez le modifier
  • cela rend le débogage plus ennuyeux, parce que vous devez suivre les getters / setters
  • Il rend la lecture du code plus difficile dans la plupart des IDEs, puisque la plupart d'entre eux colorent les champs différemment que les variables locales

... mais comme toujours, il y a des exceptions. Certains setters peuvent avoir des effets secondaires (par exemple définir une seconde valeur) que vous voulez exécuter, alors il pourrait être préférable d'utiliser le setter. En outre, si vous concevez votre classe pour l'héritage, il peut être préférable d'aller via un accessor si vous voulez que la sous-classe soit en mesure de modifier le comportement.

13
répondu waxwing 2011-12-11 20:45:41

En général, non. Si votre getter renvoie quelque chose d'autre que la valeur du champ, alors vous devriez utiliser la méthode, mais dans ce cas rare votre méthode devrait avoir un nom plus descriptif. Pour un mauvais exemple, si vous avez:

public void setName(String name)
{
  _name = name;
}

et votre getter retourné quelque chose d'autre, comme

public String getName()
{
  return _name.toUpperCase();
}

alors oui, vous devriez utiliser de la lecture. Il serait préférable, cependant, d'avoir un nom plus descriptif pour ce getter:

public String getNameAsUppercase()
{
  return _name.toUpperCase();
}
7
répondu Paul 2011-12-11 19:38:37