224 votes

Le moyen le plus propre de faire basculer une variable booléenne en Java ?

Existe-t-il une meilleure façon de nier un booléen en Java qu'un simple if-else ?

if (theBoolean) {
    theBoolean = false;
} else {
    theBoolean = true;
}

0 votes

Oh bien, j'étais sur le point de poser la même question, bien que ma question aurait été spécifique à javascript/as3, ou ECMAScript en général je suppose... qui sera facilement couvert par cette question.

0 votes

Et s'il n'y a pas d'opérateur !

2voto

Steven Spungin Points 5660

Si vous utilisez des valeurs booléennes NULL et les considérez comme fausses, essayez ceci :

static public boolean toggle(Boolean aBoolean) {
    if (aBoolean == null) return true;
    else return !aBoolean;
}

Si vous ne traitez pas les valeurs booléennes NULL, essayez ceci :

static public boolean toggle(boolean aBoolean) {
   return !aBoolean;
}

Ce sont les le plus propre parce qu'ils montrent l'intention dans la signature de la méthode, sont plus faciles à lire par rapport aux ! et peut être facilement débogué.

Utilisation

boolean bTrue = true
boolean bFalse = false
boolean bNull = null

toggle(bTrue) // == false
toggle(bFalse) // == true
toggle(bNull) // == true

Bien sûr, si vous utilisez Groovy ou un langage qui autorise les méthodes d'extension, vous pouvez enregistrer une extension et simplement faire :

Boolean b = false
b = b.toggle() // == true

0 votes

Bonne approche, mais pas totalement dépourvue d'ambiguïté (selon moi). Pour quelqu'un qui utilise/lit juste "toggle(..)" pourrait penser que l'appel de la méthode (sans l'assigner à nouveau à la variable) pourrait déjà basculer la variable sous-jacente. C'est évident pour nous en voyant le code, mais dans la vie réelle, cela pourrait être assez difficile à déboguer. Un meilleur nom de méthode pourrait être "opposé" ou éventuellement "négation", pour rendre cela un peu plus évident ; ou utiliser la première approche avec un objet Boolean et le basculer réellement dans la méthode (mais toujours un peu ambigu).

1voto

Alex Points 11

La classe BooleanUtils supporte la négation d'un booléen. Vous trouverez cette classe dans commons-lang:commons-lang

BooleanUtils.negate(theBoolean)

-1voto

Adam Wise Points 61

LeBooléen ^= 1

Cette syntaxe est intéressante car elle semble utiliser le nombre minimum de frappes au clavier. (Et vous pouvez supprimer les espaces pour réduire le nombre de caractères par deux. De toute évidence, cette réponse est similaire à celle de nlaq.

En pratique, si vous disposez d'un post-processeur JavaScript qui supprime les commentaires de la sortie, vous voudrez probablement ajouter un commentaire. Quelque chose comme ceci :

theBoolean ^= 1 ; //Une astuce XOR qui fait basculer la valeur booléenne. (D'après StackOverflow)

-1voto

Will D. Points 7

Si vous ne faites rien de particulièrement professionnel, vous pouvez toujours utiliser une classe utilitaire. Ex, une classe util d'un projet pour une classe.

public class Util {

public Util() {}
public boolean flip(boolean bool) { return !bool; }
public void sop(String str) { System.out.println(str); }

}

alors il suffit de créer un objet Util Util u = new Util(); et avoir quelque chose pour le retour System.out.println( u.flip(bool) );

Si vous devez utiliser la même chose encore et encore, utilisez une méthode, et surtout si c'est pour plusieurs projets, créez une classe utilitaire. Je ne sais pas quelle est la norme industrielle cependant. (Les programmeurs expérimentés sont libres de me corriger)

0 votes

Descendu. 1. Cela n'améliore pas la lisibilité. 2. Il ajoute une sérieuse surcharge de temps d'exécution. 3. Les classes utilitaires sont généralement une odeur de code.

-2voto

Denys Points 424

Malheureusement, il n'y a pas de forme courte comme les nombres ont une incrémentation/décrémentation :

i++ ;

Je voudrais avoir une expression courte similaire pour inverser un booléen, dmth comme :

isEmpty !

0 votes

Je ne sais pas pourquoi vous dites cela alors que la réponse à cette question a été donnée dans ce fil il y a douze ans.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X