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
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.
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).
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.
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.
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)
.
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.
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.
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.
Encapsulez les champs privés d'une classe et exposez-les avec les classes getter/setter comme vous le souhaitez.