web-dev-qa-db-fra.com

l'expression de commutateur ne peut pas être flottante, double ou booléenne

Pourquoi l'expression switch n'autorise-t-elle pas les valeurs long, float, double ou boolean en Java? pourquoi seuls int (et ceux qui sont automatiquement promus en int) sont-ils autorisés?

30
saravanan

Float et double seraient difficiles à utiliser de manière fiable même s'ils étaient possibles - n'oubliez pas que l'exécution de correspondances d'égalité exactes sur float/double est généralement une mauvaise idée de toute façon, en raison de la nature de la représentation.

Pour les valeurs booléennes, pourquoi ne pas simplement utiliser if pour commencer?

Je ne me souviens pas jamais vouloir allumer l'un de ces types, pour être honnête. Avez-vous un cas d'utilisation particulier à l'esprit?

31
Jon Skeet

Vous pouvez utiliser enum dans une instruction switch et Java 7 ajoutera la chaîne AFAIK. L'instruction switch vient de C où seuls les int étaient autorisés et l'implémentation d'autres types est plus compliquée.

Les nombres à virgule flottante ne sont pas un bon choix pour le changement car la comparaison exacte est souvent rompue par des erreurs d'arrondi. par exemple. 0.11 - 0.1 == 0.01 c'est faux.

activer booléen n'est pas très utile car une simple instruction if serait plus simple

if(a) {

} else { 

}

ne serait pas plus simple avec

switch(a) {
  case true:

     break;
  case false:

     break;
}

BTW: J'utiliserais switch (long) s'il était disponible, mais ce n'est pas le cas. C'est un cas d'utilisation rare pour moi de toute façon.

4
Peter Lawrey

Pour float et double float et double, je suppose qu'ils l'ont omis pour les mêmes raisons que pourquoi c'est une mauvaise idée de les comparer en utilisant == .

Pour booléen, cela peut être simplement parce que cela correspondrait à une instruction if de toute façon. N'oubliez pas que vous ne pouvez avoir que des constantes dans les expressions de cas, donc les cas correspondraient toujours à if (someBool) et if (!someBool).

Pour long je n'ai pas d'explication. Il me semble qu'une telle fonctionnalité aurait peut-être dû être incluse lors de la conception du langage.

2
aioobe

Généralement, la structure à casse de commutation est utilisée lors de l'exécution de certaines opérations basées sur une variable d'état. Là, un int a plus qu'assez d'options. Boolean n'en a que deux donc un normal est généralement assez bon. Les doubles et les flotteurs ne sont pas vraiment précis pour être utilisés de cette façon.

Franchement, je ne peux pas imaginer un cas d'utilisation pour ce genre de choses, aviez-vous un problème pratique à l'esprit avec cette question?

1
Mikko Wilkman