Pour un champ booléen, quelle est la convention de dénomination de son getter / setter?

178

Par exemple.

boolean isCurrent = false;

Comment nommez-vous son getter et son setter?

user496949
la source
2
Je suppose que vous faites référence à JavaBeans, auquel cas la réponse de @Jigar Joshi est correcte. Cependant, si vous posez des questions sur les getter / setters génériques, la seule convension est que les méthodes contiennent le nom du champ et que le getter ne prend aucun argument et renvoie une valeur, le setter prend un argument et ne renvoie aucune valeur ou retourne l'objet lui-même. voir Buffer comme exemple d'une autre approche des getter / setters.
Peter Lawrey

Réponses:

255

Supposons que vous ayez

boolean active;

La méthode des accesseurs serait

public boolean isActive(){return this.active;}

public void setActive(boolean active){this.active = active;}

Voir également

Jigar Joshi
la source
9
Pourriez-vous indiquer la section des conventions de code de Sun où les noms de getter booléens sont spécifiquement couverts? Je n'ai pas pu le trouver.
Konstantin Pelepelin
4
J'ai un champ booléen nommé hasCustomName, maintenant que dois-je nommer pour ses méthodes getter et setter ? Est-ce setHasCustomName[setter]et hasCustomName[getter]bon?
Hadi
@Hadi nomme simplement votre variable "customerName" et génère un getter n setter pour cela. Les getter et les setters attendus sont public boolean isCustomerName(){return this.customerName;} public void setCustomerName(boolean customerName){this.customerName= customerName;}
Assegd
1
comment passer du nom personnalisé au nom du client? ;)
Kartik Chugh
1
@Assegd Le nommer "customerName" ou "customName" est déroutant et ne signifie pas qu'il est booléen. En voyant la variable, je m'attendrais à ce qu'elle contienne un nom. Dans ce cas, il doit être appelé "hasCustomName" IMO.
Nathan le
83

http://geosoft.no/development/javastyle.html#Specific

  1. is Le préfixe doit être utilisé pour les variables et méthodes booléennes.

    isSet, isVisible, isFinished, isFound,isOpen

Il s'agit de la convention de dénomination des méthodes booléennes et des variables utilisées par Sun pour les packages Java Core. L'utilisation du préfixe is résout un problème courant de choix de mauvais noms booléens tels que status ou flag. isStatus ou isFlag ne correspondent tout simplement pas, et le programmeur est obligé de choisir des noms plus significatifs.

Les méthodes Setter pour les variables booléennes doivent avoir un préfixe défini comme dans:

void setFound(boolean isFound);

Il existe quelques alternatives au préfixe is qui s'adaptent mieux dans certaines situations. Ce sont les préfixes has, can et should:

boolean hasLicense(); 
boolean canEvaluate(); 
boolean shouldAbort = false;
Narayan
la source
7
Donc, s'il y a la propriété booléenne hasData, à quoi ressemblerait le setter? Très certainement, cela setData(bool hasData)me semble terriblement faux ...
Franz B.
7
@FranzB. J'utiliserais setHasData (...)
user362178
2
Pour ceux qui veulent suit JavaBeans Specifcation, il semble que has, can, shouldpréfixes ne font pas partie de la spécification. Référence JavaBeans Specification 1.01 section 8.3.
VCD
@Andrew salut. Lorsque j'utilise le préfixe «est» dans ma variable et que j'envoie la valeur de cette variable à partir de mon fichier js dans les données, cela me donne toujours la valeur false. Et si je supprime le préfixe «est», cela fonctionne parfaitement. Quelle peut en être la raison? Merci d'avance.
Me_developer
1
Le setter est simple, pour le getter, j'ai dû utiliser boolean isIsCurrent(){...}sinon le framework utilisé pour désérialiser l'objet, se plaignait getter not found for property isCurrent.
Maurizio Lo Bosco
67

Pour un champ nommé isCurrent, le nom correct du getter / setter est setCurrent()/ isCurrent()(du moins c'est ce que pense Eclipse), ce qui est très déroutant et peut être retracé au problème principal:

Votre champ ne doit pas être appelé isCurrenten premier lieu. Is est un verbe et les verbes ne sont pas appropriés pour représenter l'état d'un objet. Utilisez plutôt un adjectif, et soudainement vos noms de getter / setter auront plus de sens:

private boolean current;

public boolean isCurrent(){
    return current;
}

public void setCurrent(final boolean current){
    this.current = current;
}
Sean Patrick Floyd
la source
4
Et si le booléen n'est pas un primitif? Si c'est booléen, doit-il être un get ou is?
Arun
2
Non, une telle méthode pourrait renvoyer null, ce qui provoquerait une NullPointerException. Mais j'essaierais d'éviter de retourner Boolean en premier lieu
Sean Patrick Floyd
3
@Arun Je pense qu'il devrait être défini / obtenu à la place si défini / est parce que Boolean est un objet au lieu de primitif, car il a 3 statistiques, false, true ou null.
Al-Mothafar
1
IntelliJ utilise par défaut le getpréfixe lors de la récupération d'un Booleanvs ispour unboolean
jocull
1
@jocull et c'est le comportement correct, selon la spécification JavaBeans
Sean Patrick Floyd
6

Je crois que ce serait:

void setCurrent(boolean current)
boolean isCurrent()
Miku
la source
1
J'aime cette convention, mais les conventions n'ont pas vraiment d'importance. Le plus important est de vous en tenir à celui que vous avez choisi.
Clement Herreman
4
Les conventions @Clement sont importantes lorsque vous comptez sur des outils qui utilisent ces conventions. JavaBeans est une convention avec un large support dans de nombreuses bibliothèques (JSP / JSF / Spring / Groovy pour n'en nommer que quelques-unes). Briser les conventions signifie briser le fonctionnement de ces bibliothèques.
Sean Patrick Floyd
1
@Sean Right, à l'exception du framework qui repose sur des conventions de configuration. Dans ce cas, les conventions sont imposées par le framework, vous n'avez donc rien choisi. Bonne remarque.
Clement Herreman
5

Il est peut-être temps de commencer à réviser cette réponse? Personnellement , je voterais pour setActive()et unsetActive()(alternatives peuvent être setUnActive(), notActive(), disable(), etc. selon le contexte) depuis « setActive » implique que vous l' activer à tout moment, que vous ne faites. C'est un peu contre-intuitif de dire "setActive" mais en fait de supprimer l'état actif.

Un autre problème est que vous ne pouvez pas écouter spécifiquement un événement SetActive de manière CQRS, vous auriez besoin d'écouter un 'setActiveEvent' et de déterminer à l'intérieur de cet écouteur s'il a été activé ou non. Ou bien sûr, déterminez quel événement appeler lors de l'appel, setActive()mais cela va alors à l'encontre du principe de séparation des préoccupations.

Une bonne lecture à ce sujet est l'article FlagArgument de Martin Fowler: http://martinfowler.com/bliki/FlagArgument.html

Cependant, je viens d'un milieu PHP et je vois cette tendance de plus en plus adoptée. Je ne sais pas à quel point cela vit avec le développement Java.

Christian Vermeulen
la source
-1
private boolean current;

public void setCurrent(boolean current){
    this.current=current;
}

public boolean hasCurrent(){
    return this.current;
}
Mkne
la source
3
a du courant quoi? Je pense que hasutilisé pour BO ou un tel service avec un certain traitement alors que pour POJO, c'est is. et veuillez ajouter une description de votre réponse.
Al-Mothafar
-3
Setter: public void setCurrent(boolean val)
Getter: public boolean getCurrent()

Pour les booléens, vous pouvez également utiliser

public boolean isCurrent()
Suraj Chandran
la source
11
Parce que l'OP énonce une question sur les valeurs booléennes. Un getter préfixé par 'get' est (lire: ne devrait) jamais être utilisé pour les valeurs booléennes.
Harold
-4

En tant que setter, que diriez-vous:

// setter
public void beCurrent(boolean X) {
    this.isCurrent = X;
}

ou

// setter
public void makeCurrent(boolean X) {
    this.isCurrent = X;
}

Je ne suis pas sûr que ces noms aient du sens pour les anglophones.

Amekusa
la source
1
Ils ne font pas vraiment sens
Yannjoel
Mais phonétiquement peut-être prometteur avec certains attributs :)
seba.wagner