web-dev-qa-db-fra.com

Quand utiliser les méthodes get / set dans java

Je veux savoir quand utiliser les méthodes get et set (getName, setName) dans ma classe et quand c'est simple classVariable.name = "" À la place а = classVariable.getName()

Voici un exemple de classe utilisant des méthodes set et get

public class ClassExampe {

    String name;
    String course;

    public String getName ( )
    {
        return name;
    }

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

    public String getCourse ( )
    {
        return course;
    }

    public void setCourse (String studentCourse)
    {
        course = studentCourse;
    }
}

Merci

24
Jovan

Utilisation de Getters/Setters vs utilisation de Fields

En règle générale:

utilisez les variables directement de la même classe (en fait du même fichier .Java, donc les classes internes sont correctes aussi), utilisez les Getters/Setters des autres classes.

37
Sean Patrick Floyd

La règle simple est: n'utilisez jamais d'accès direct (sauf, bien sûr, lorsque vous vous y référez depuis l'intérieur de la classe).

  • l'accès au champ ne peut pas être mandaté
  • vous voudrez peut-être avoir une notification d'événement
  • vous voudrez peut-être vous prémunir contre les conditions de course
  • les langues d'expression soutiennent les setters et les getters
  • théoriquement, cela rompt l'encapsulation. (Si nous sommes pédants, setter et getter pour tous les champs interrompent également l'encapsulation)
  • vous peut voulez effectuer une logique supplémentaire à l'intérieur du setter ou du getter, mais cela est rarement conseillé, car les consommateurs s'attendent à ce que cela suive la convention - c'est-à-dire être un simple getter/setter.
  • vous pouvez spécifier uniquement un setter ou seulement un getter, obtenant ainsi un accès en lecture seule ou en écriture seule.

Même si cela ne se produit pas et que vous en avez besoin, ce n'est pas improbable. Et si vous commencez avec l'accès aux champs, il sera plus difficile de changer.

23
Bozho

En Java, l'utilisation d'un getter et d'un setter est généralement considérée comme la meilleure pratique.

En effet, si jamais vous avez besoin de changer votre code pour faire autre chose quand une propriété est accédée ou modifiée, vous pouvez simplement la changer dans le getter ou le setter existant.

J'ai tendance à penser que cela provoque un peu d'encombrement pour les objets simples, mais si vous avez déjà dû refactoriser une propriété publique à un getter et un setter pour ajouter des fonctionnalités supplémentaires, vous verrez que cela peut être pénible.

10
Alan Geleynse

Je soupçonne que la plupart diront de toujours utiliser des getters/setters pour accéder aux membres privés. Ce n'est pas nécessaire, mais est considéré comme une "meilleure pratique".

Un avantage est que vous pouvez avoir plus qu'une simple affectation et un retour. Exemple:

public void setLevel(int lvl)
{
    if (lvl<0)
    {
        this.level=1;
    }
    else
        this.level = lvl;
}

public int getLevel()
{
    if (this.someIndicator==4)
        return this.level*7.1;
    else
        return level;
}

Les Getters et Setters vous permettent de modifier l'implémentation plus tard (par exemple, faire quelque chose de plus complexe), vous permettent d'implémenter des règles de validation (par exemple setName lève une exception si le nom ne dépasse pas 5 caractères, peu importe.)

Vous pouvez également choisir d'ajouter un getter mais pas un setter afin que la variable soit comme "en lecture seule".

C'est la théorie, cependant dans de nombreux cas (par exemple Hibernate utilisant des setters) vous ne pouvez pas lancer d'exceptions dans les setters donc vous ne pouvez pas faire de validation. Normalement, la valeur sera simplement attribuée/renvoyée. Dans certaines entreprises dans lesquelles j'ai travaillé, il a été obligatoire d'écrire des getters et setters pour tous les attributs.

Dans ce cas, si vous souhaitez accéder à un attribut depuis l'extérieur d'un objet et que vous souhaitez qu'il soit lisible/inscriptible, j'utilise simplement un attribut public. C'est moins de code, et cela signifie que vous pouvez écrire des choses comme obj.var += 5 Qui est plus facile à lire que obj.setVar(obj.getVar() + 5).

3
Adrian Smith

Si vous voulez dire: quand utiliser des méthodes d'accesseur public au lieu de rendre publique la variable interne et privée, ma réponse est "toujours" à moins qu'il y ait une grave raison de performance.

Si vous voulez dire, appelez vos propres méthodes get et set vs accès direct aux vars w/dans votre classe, je dis toujours appeler vos propres méthodes d'accès. De cette façon, toute conversion, modification ou règle que vous implémentez dans le cadre de get/set est invoquée automatiquement par vos propres appels internes et externes.

Dans les langues pures OO (par exemple, Smalltalk), il n'y a pas de concept public - toutes les variables internes sont privées et vous devez donc utiliser des accesseurs. Dans les versions moins pures OO = langues, vous pouvez rendre les choses publiques - cependant, exposer les éléments internes de vos structures de données et de leur mise en œuvre est une idée exceptionnellement mauvaise pour la stabilité et la maintenance à long terme. Consultez la section "couplage étroit" pour en savoir plus.

Autrement dit, si vous exposez publiquement des variables internes, les gens peuvent y accéder directement et si vous changez de nom ou saisissez tout en bas de ligne. C'est ce qu'on appelle les effets secondaires.

2
Joe

En général, vous souhaitez utiliser des setters et des getters pour donner aux développeurs la possibilité de réutiliser votre code en le modifiant ou en l'étendant pour ajouter des couches de traitement et de contrôle lors de l'accès et de la modification de vos données internes. Cela ne serait pas possible dans Java lors de l'utilisation des accès directs.

Parenthèses: Cependant, il est parfaitement possible dans d'autres langues, par exemple dans Scala, lorsque la ligne entre les propriétés et les méthodes peut devenir assez fine. Et c'est génial, car cela ne devient pas un problème de codage qui entre le chemin et il rend l'utilisation plus transparente.


Vous pouvez également souvent considérer que dans votre classe, vous pouvez vous sentir libre d'accéder directement à vos membres internes (privés ou protégés), car vous êtes censé savoir ce que vous faites, et vous n'avez pas encore à supporter les frais généraux de un autre appel de méthode.

Dans la pratique, plusieurs personnes travaillant sur une classe peuvent ne pas savoir ce que tout le monde fait et ces lignes de vérification d'intégrité dans vos getters et setters peuvent être utiles dans la plupart des cas, contrairement à la micro-optimisation.


De plus, il n'y a qu'une seule façon d'accéder directement à une variable, alors que vous pouvez définir autant d'accesseurs que vous le souhaitez.

1
haylem

C'est une question de goût, mais en règle générale, vous devez toujours utiliser les méthodes get/set pour toutes les propriétés publiques. Mais pour des choses comme les objets de valeur (VO) qui ne vous dérangeront probablement pas pendant un certain temps, vous pouvez utiliser des variables publiques sans être trop critiqué, je pense.

1
Piotr

Encapsulez les champs privés d'une classe et exposez-les avec les classes getter/setter comme vous le souhaitez.

0
dimitrisli