158 votes

Quand faut-il utiliser les valeurs nulles des booléens ?

Java boolean permet des valeurs de true et false tandis que le booléen permet true , false et null . J'ai commencé à convertir mes boolean s à Boolean s. Cela peut provoquer des plantages dans des tests tels que

Boolean set = null;
...
if (set) ...

tandis que le test

if (set != null && set) ...

semble artificiel et source d'erreurs.

Quand, si jamais, il est utile d'utiliser Boolean avec des valeurs nulles ? Si jamais, alors quels sont les principaux avantages de l'objet enveloppé ?

MISE À JOUR : Il y a eu tellement de réponses intéressantes que j'en ai résumé une partie dans ma propre réponse. Je suis au mieux un intermédiaire en Java donc j'ai essayé de montrer les choses que je trouve utiles. Notez que la question est "incorrectement formulée" (un booléen ne peut pas "avoir une valeur nulle") mais je l'ai laissée au cas où d'autres personnes auraient la même idée fausse.

240voto

JB Nizet Points 250258

Utilisez boolean plutôt que Boolean chaque fois que vous le pouvez. Vous éviterez ainsi de nombreux NullPointerException et rendre votre code plus robuste.

Boolean est utile, par exemple

  • pour stocker les booléens dans une collection (List, Map, etc.)
  • pour représenter un booléen annulable (provenant d'une colonne booléenne annulable dans une base de données, par exemple). La valeur nulle peut signifier "nous ne savons pas si c'est vrai ou faux" dans ce contexte.
  • chaque fois qu'une méthode a besoin d'un objet comme argument, et que vous devez passer une valeur booléenne. Par exemple, lorsque vous utilisez la réflexion ou des méthodes comme MessageFormat.format() .

58voto

Tomasz Nurkiewicz Points 140462

Je n'utilise presque jamais Boolean parce que sa sémantique est vague et obscure. Fondamentalement, vous avez une logique à trois états : vrai, faux ou inconnu. Il est parfois utile de l'utiliser lorsque, par exemple, vous avez donné à l'utilisateur un choix entre deux valeurs et que l'utilisateur n'a pas répondu du tout et que vous voulez vraiment connaître cette information (pensez à une colonne de base de données NULLable).

Je ne vois aucune raison de passer de boolean à Boolean car il introduit une surcharge de mémoire supplémentaire, une possibilité de NPE et moins de typage. Typiquement, j'utilise des BooleanUtils.isTrue() pour me rendre la vie un peu plus facile avec Boolean .

La seule raison de l'existence de Boolean est la possibilité d'avoir des collections de Boolean (les génériques ne permettent pas boolean ainsi que toutes les autres primitives).

32voto

user606723 Points 1601

Wow, qu'est-ce que c'est que ça ? C'est moi ou toutes ces réponses sont fausses ou du moins trompeuses ?

La classe booléenne est une enveloppe autour du type primitif booléen. L'utilisation de ce wrapper est de pouvoir passer un booléen dans une méthode qui accepte un objet ou un générique. Ie vecteur.

Un objet booléen ne peut JAMAIS avoir une valeur nulle. Si votre référence à un booléen est nul, cela signifie simplement que votre booléen n'a jamais été créé.

Vous pourriez trouver cela utile : http://grepcode.com/file/repository.grepcode.com/java/Root/jdk/openjdk/6-b14/java/lang/Boolean.java

Une référence booléenne nulle ne doit être utilisée que pour déclencher une logique similaire à celle pour laquelle vous disposez de toute autre référence nulle. Son utilisation pour une logique à trois états est maladroite.

EDIT : remarque, que Boolean a = true; est une déclaration trompeuse. Cela équivaut en réalité à quelque chose de plus proche de Boolean a = new Boolean(true); Veuillez voir l'autoboxing ici : http://en.wikipedia.org/wiki/Boxing_%28computer_science%29#Autoboxing

C'est peut-être de là que vient une grande partie de la confusion.

EDIT2 : Veuillez lire les commentaires ci-dessous. Si quelqu'un a une idée sur la façon de restructurer ma réponse pour intégrer ceci, merci de le faire.

24voto

Grzegorz Grzybek Points 2713

Il y a trois raisons rapides :

  • pour représenter les valeurs booléennes des bases de données, qui peuvent être true , false ou null
  • pour représenter l'élément XML Schema xsd:boolean les valeurs déclarées avec xsd:nillable="true"
  • pour pouvoir utiliser des types génériques : List<Boolean> - vous ne pouvez pas utiliser List<boolean>

10voto

Francisco Spaeth Points 10069

Les classes enveloppantes pour les primitives peuvent être utilisées lorsque des objets sont nécessaires, les collections en sont un bon exemple.

Imaginez que vous devez, pour une raison quelconque, stocker une séquence de boolean dans un ArrayList cela peut être fait en mettant en boîte boolean sur Boolean .

Il y a quelques mots à ce sujet ici

De la documentation :

Comme tout programmeur Java le sait, vous ne pouvez pas mettre un int (ou une autre valeur primitive) dans une collection. valeur primitive) dans une collection. Les collections ne peuvent contenir que des références d'objets, donc vous devez mettre les valeurs primitives dans la classe wrapper appropriée (qui est Integer dans le cas de int). Lorsque vous sortez l'objet de collection, vous obtenez l'Integer que vous y avez placé ; si vous avez besoin d'un int, vous devez retirer l'Integer de la collection. int, vous devez déballer l'Integer en utilisant la méthode intValue. Toutes ces opérations boxing et unboxing sont pénibles et encombrent votre code. Le site automatisent le processus, éliminant ainsi la douleur et le désordre. la douleur et l'encombrement.

http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

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