web-dev-qa-db-fra.com

Pourquoi booléen en Java ne prend que vrai ou faux? Pourquoi pas 1 ou 0 aussi?

Y a-t-il une raison pour laquelle Java les booléens ne prennent que true ou false pourquoi pas 1 ou 0 également?

43
GuruKulki

Java, contrairement aux langages comme C et C++, traite boolean comme un type de données complètement séparé qui a 2 valeurs distinctes: true et false. Les valeurs 1 et 0 sont de type int et ne sont pas implicitement convertibles en boolean.

46
JaredPar

Parce que les booléens ont deux valeurs: true ou false. Notez que ce ne sont pas des chaînes, mais des littéraux booléens réels.

1 et 0 sont des entiers, et il n'y a aucune raison de confondre les choses en les rendant "alternatif vrai" et "alternatif faux" (ou l'inverse pour ceux qui utilisent les codes de sortie Unix?). Avec une saisie forte dans Java il ne devrait y avoir que deux valeurs booléennes primitives.

EDIT: Notez que vous pouvez facilement écrire une fonction de conversion si vous le souhaitez:

public static boolean intToBool(int input)
{
   if (input < 0 || input > 1)
   {
      throw new IllegalArgumentException("input must be 0 or 1");
   }

   // Note we designate 1 as true and 0 as false though some may disagree
   return input == 1;
}

Bien que je ne recommanderais pas cela. Notez comment vous ne pouvez pas garantir qu'une variable int est bien 0 ou 1; et il n'y a pas de sémantique 100% évidente de ce que l'on veut dire vrai. En revanche, une variable boolean est toujours true ou false et c'est évident ce qui signifie vrai. :-)

Donc, au lieu de la fonction de conversion, habituez-vous à utiliser les variables boolean pour tout ce qui représente un concept vrai/faux. Si vous devez utiliser une sorte de chaîne de texte primitive (par exemple pour le stockage dans un fichier plat), "vrai" et "faux" sont beaucoup plus clairs dans leur signification et peuvent être immédiatement transformés en booléens par la méthode de la bibliothèque Boolean.valueOf .

29
Andrzej Doyle

Parce que les personnes qui ont créé Java voulaient que booléen signifie sans ambiguïté vrai ou faux, pas 1 ou 0.

Il n'y a pas de consensus entre les langues sur la façon dont 1 et 0 se convertissent en booléens. C utilise n'importe quelle valeur non nulle pour signifier vrai et 0 pour signifier faux, mais certains shells UNIX font le contraire. L'utilisation d'ints affaiblit la vérification de type, car le compilateur ne peut pas se prémunir contre les cas où la valeur int transmise n'est pas quelque chose qui devrait être utilisé dans un contexte booléen.

17
Nathan Hughes

Une autre chose que les autres réponses n'ont pas souligné est que l'un des avantages de ne pas traiter les entiers comme des valeurs de vérité est qu'il évite ce syndrome de bogue C/C++:

int i = 0;
if (i = 1) {
    print("the sky is falling!\n");
} 

En C/C++, l'utilisation erronée de = plutôt que == provoque une évaluation inattendue de la condition sur "vrai" et met à jour i en tant qu'effet secondaire accidentel.

En Java, il s'agit d'une erreur de compilation, car la valeur de l'assignation i = 1 a le type int et un boolean est requis à ce stade. Le seul cas où vous auriez des ennuis dans Java est si vous écrivez du code boiteux comme ceci:

boolean ok = false;
if (ok = true) {  // bug and lame style
    print("the sky is falling!\n");
}

... que toute personne ayant une once de "bon goût" écrirait comme ...

boolean ok = false;
if (ok) {
    print("the sky is falling!\n");
}
16
Stephen C

Sur une note connexe: le compilateur Java utilise int représenter booléen puisque JVM a un support limité pour le type booléen. Voir Section 3.3.4 Le type booléen .

Dans JVM, le zéro entier représente false, et tout entier non nul représente vrai (Source: Inside Java Virtual Machine par Bill Venners)

3
sateesh

Être précis à ce sujet vous éloigne de la VRAIE entière dans VB est -1 et dans d'autres langages, true est simplement NON ZERO. Garder le champ booléen vrai ou faux conserve Java en dehors de cet argument.

3
Shaun F

Même s'il existe un type de données booléen (abréviation de booléen) en C++. Mais en C++, toute valeur non nulle est une valeur true incluant des nombres négatifs. Un 0 (zéro) est traité comme faux. Où comme dans Java il y a un type de données booléen séparé pour true et false.

1
ElectricGeek