Quand utiliser une instruction switch en Java
J'apprécie tout ce qui peut être fait par un interrupteur de tresorerie, peut être fait par un if else.
Mais sont-il des règles stylistiques pour quand il faut utiliser le commutateur plutôt que si le reste de tresorerie.
Lorsque vous ne voulez pas bête noire d'envoi de la prochaine développeur qui a pour maintenir vos codes 100x if/else.
Je ne sais pas... je pense que je serais tout aussi agacé par 100 cas dans un commutateur. 🙂 Sent la mauvaise conception.
Toujours car plus rapide: stackoverflow.com/questions/2086529
Je ne sais pas... je pense que je serais tout aussi agacé par 100 cas dans un commutateur. 🙂 Sent la mauvaise conception.
Toujours car plus rapide: stackoverflow.com/questions/2086529
OriginalL'auteur Dan | 2010-01-20
Vous devez vous connecter pour publier un commentaire.
Bien,
switch
se sent plus "léger" dans de nombreux cas, qu'unif
/else if
échelle, à mon avis. Fondamentalement, vous n'avez pas beaucoup de syntaxe avec des accolades et des parenthèses dans le titre de votre code. Cela étant dit,switch
hérite de C de la syntaxe. Cela signifie que vous avezbreak
et une seule portée pour les variables, sauf si vous introduisez de nouveaux blocs.Encore, le compilateur est capable d'optimiser
switch
instructions dans une table de recherche et effectuer au moment de la compilation de la vérification pour les littéraux lorsque vous traitez avec les énumérations. Donc, je suggère qu'il est généralement préférable d'utiliserswitch
surif
/else if
si vous avez affaire avec le numérique ou les types d'énumérations.Est-ce définitif? Enfin, je sais il était encore à encore décidé.
OriginalL'auteur Joey
Commutateur dispose d'un avantage quand il s'agit de la clarté:
Si le code 2 et 4 sont identiques, il peut être plus clair que:
Il est aussi plus facile pour vous (ou un autre programmeur) pour séparer les 2 et 4 cas.
else if (i % 2 == 0)
. Parfois je m'ennuie de VB estSelect Case
🙂OriginalL'auteur Armstrongest
- Je utiliser les instructions switch pour les énumérations, c'est plus lisible qu'un if else if else if. Toutefois, vous devriez essayer d'éviter de tels contrôles dans un OO design.
OriginalL'auteur bertolami
Vous utilisez une instruction switch lorsque vous passez sur des valeurs différentes de la primitive /enum /wrapper types. (Et pas tous les primitives /wrapper types, tout pris en charge, ceux - byte, short, char, int).
Si/d'autre se charge du reste.
Par exemple, il est plus esthétique de dire:
etc.
que
pour un grand nombre de cas. Mais vous ne pouvez pas passer sur des Chaînes de caractères, ou les valeurs de la fonction, ou de conditions complexes, donc si vous avez besoin de faire tout ça, alors vous êtes coincé avec if/else.
J'ai pris l'habitude de toujours taper le
case
etbreak
en paires. De cette façon, je les oublie jamais. Mais je suis d'accord que ce n'est pas trop agréable. Bien qu'il existe probablement pas beaucoup de gens en argumentant sur le devant 🙂Accord au moins avec le si-sinon vous avez la syntaxe pour vous aider - peut-être la valeur par défaut dans un commutateur doit avoir été à la pause après un cas a été apparié.
OriginalL'auteur danben
Personnellement, j'utilise de trouver à la fois des constructions un peu trop de procédure.
Bien que l'on peut considérer comme OO extermism, j'utilise pour l'utilisation d'une Carte contenant les occurrences d'une interface interne pour chaque cas de la si.
Elle permet de mieux le code de l'isolation, je pense.
Cependant, pour vraiment répondre à votre question, je n'utilise que des switchs quand j'ai le cas que vraiment se chevauchent (le, la, je n'utilise pas de break). Malheureusement, ce n'est vraiment pas un bloc de code maintenable.
OriginalL'auteur Riduidel
Je vous suggère la règle est simple:
Toujours utiliser un
switch
lorsque vous avez au moins 2 options pour le différencier, lorsque le type de données est utilisable pour un interrupteur et lorsque toutes les options ont des valeurs constantes.Il y a trois bonnes raisons. L'un, dans la plupart des cas
switch
est plus rapide qu'uneif
/else
cascade. De deux, il fait l'intention de le code plus clair. Trois, oh si mauvais oubliébreak
dilemme est un moindre mal que d'énormesif
/else
cascades qu'accidentellement casser parce que quelqu'un a oublié unelse
.De machines virtuelles Java effectivement prendre en charge deux types différents de commutateur: le tableswitch et la lookupswitch instruction. Le tableswitch est généré par le compilateur si tous les
case
constantes se situent dans une fourchette étroite, sinon, elle génère un lookupswitch. Pour les grandesswitch
consolidés avec de nombreux cas, la tableswitch est plus efficace que la lookupswitch. Le lookupswitch est généralement mis en œuvre par une certaine forme de recherche binaire.break
vs oubliéelse
. Je ne pense pas qu'il pourrait être soutenu que l'un est plus probable que les autresOriginalL'auteur x4u
Il y a deux facteurs pour moi:
Lisibilité et si vous voulez choisir quelque chose à l'aide de gammes de valeurs ou conditions (dans les instructions switch vous ne pouvez utiliser qu'un seul nombre ou de la valeur énumérée).
if
déclaration.OriginalL'auteur Alex
tout d'abord, l'instruction switch doit être utilisable. Si le commutateur est basé sur la valeur d'une variable, alors il peut être utilisé. Si il est basé sur un complexe ET/OU/NON expression booléenne qui varie pour chaque condition, alors vous ne pouvez pas l'utiliser du tout.
Cela étant dit, s'il est applicable, et il y a au moins 2 cas, puis-je utiliser le switch. Il est plus facilement extensible, facile à lire et à vérifier.
OriginalL'auteur Larry Watanabe
Interrupteur et les énumérations.
Si la valeur d'enum vous test peut légitimement être
null
pour une raison quelconque, de le mettre dans l'instruction switch va générer une exception NullPointerException. Sans regarder le code octet c'est un peu décevant qu'il le ferait.L'explication: les énumérations sont sucre syntaxique introduit dans la version 1.5. Instruction Switch fonctionne toujours avec une bonne ole entiers, mais les valeurs que l'on utilise sont des ordinaux attribué enum. Afin d'obtenir le nombre, la valeur d'enum DOIT être non null.
if statement
, d'autre part, serait heureux d'accepternull
pour une valeur d'enum et simplement de ne pas le tester sans NPE.OriginalL'auteur Alexander Pogrebnyak
Peut-être un peu hors-sujet, mais si j'ai répondu juste à la question dans le titre, alors je dirais que vous ne devriez pas utiliser l'interrupteur dans toutes les situations où des cas représenter les états d'un objet. État modèle est beaucoup plus joli solution dans ces cas.
OriginalL'auteur Roman
J'ai toujours trouvé que le java instruction switch n'est pas aussi puissant que j'en ai besoin. Dans son la dernière version lambdaj il met en œuvre avec une utilisation intelligente de la fermeture et de Hamcrest matcher.
Par exemple le lambdaj Switcher permet de mettre en œuvre un modèle de stratégie. En supposant que vous avez pour basculer entre les trois algorithme de tri basée sur certaines caractéristiques de la liste à trier. En particulier, supposons que nous avons un algorithme spécialisé pour les Chaînes:
un autre qui fonctionne bien avec de petites listes n'ayant pas plus de 100 articles:
et plus objectif général:
Compte tenu de ces 3 méthodes de tri, il est possible de créer une stratégie qui choisit le plus adapté dans la suite de façon déclarative:
et trier une liste en utilisant le meilleur algorithme disponible en invoquant l'Aiguilleur:
OriginalL'auteur Mario Fusco
La réponse dépend exactement ce que vous faites ainsi que de la distribution des choix.
Si une condition est dominant alors la si/alors est approprié.
Si les conditions sont uniformément répartis sur l'optimisation du compilateur va fournir un avantage de performance. Cette différence de performance devient de plus en plus prononcé à mesure que le nombre de choix possibles augmente.
Cela dit, si la performance n'est PAS important d'aller avec qui jamais vous approche que vous préférez comme la plus lisible (plus facile à gérer et plus facile à écrire).
Si, d'autre part, si votre code est dans une zone sensible où la performance EST importante, vous devriez aller avec le commutateur.
Pour les "très grandes" conditions de Mario exemple de la lambdaj switcher est vraiment cool et avec des soins sur l'initialisation se traduira par de très haute performance. Il est très un codage similaire à ce que l'optimiseur est la génération. J'appellerai la "très grande" comme quand le nombre d'options est grande ou assez complexe pour en faire une valeur de type tout ce qui dans la, et la valeur de l'appui de la confusion à la suivre sur le développeur est en train d'essayer de passer par le code. (Commentaire de votre code avec pourquoi vous avez tout ça!).
OriginalL'auteur theCTO
si vous avez trop de conditions à vérifier pour ce type u peut aller de l'interrupteur.
OriginalL'auteur GuruKulki
Comme avec d'autres langages tels que C ou C++, les instructions switch sont utiles lorsque vous voulez comparer une variable donnée avec une liste de valeurs possibles et effectuer une action en fonction de ces valeurs. Il est terser que si else.
OriginalL'auteur Otávio Décio
Je suis d'accord avec x4u réponse.
En outre, il ya une autre instance ne sont pas mentionnés, mais où, je pense qu'il est préférable d'utiliser
if
-else
blocs plutôt qu'unswitch
: lorsque des conditions supplémentaires à chacun descase
blocs sont testés avecif
blocs. Je vois ce mélange tout le temps dans le code existant.Par exemple je viens de tomber sur ce code qui a un
switch
sur une chaînetype
et vérifie ensuite une deuxième chaîneextension
à l'aide d'unif
dans les deuxcase
consolidés.Au lieu de cela, il est beaucoup plus propre et moins complexes pour réduire cela à un
if
else
OriginalL'auteur Kirby
Interrupteur a deux inconvénients:
Souvent commutateur est un signe de mauvaise OO design, parce que vous feriez mieux d'utiliser le polymorphisme.
Le seul avantage possible de l'interrupteur, c'est qu'elle est plus lisible. Mais est
plus lisible que ce:
Je dirais: non! Et vous n'aurait pas les inconvénients de l'interrupteur.
Ma suggestion: Essayez d'éviter de basculer.
Tout à fait d'accord, si votre écriture OO code que vous trouverez très peu de besoin pour les instructions de commutation.
OriginalL'auteur deamon