Java instruction switch de multiples cas
Juste à essayer de comprendre comment utiliser un grand nombre de cas multiples pour un Java instruction switch. Voici un exemple de ce que je suis en train de faire:
switch (variable)
{
case 5..100:
doSomething();
break;
}
au lieu d'avoir à le faire:
switch (variable)
{
case 5:
case 6:
etc.
case 100:
doSomething();
break;
}
Des idées si cela est possible, ou ce qu'est une bonne alternative est?
- On dirait que vous êtes en utilisant des entiers, donc je suppose que si vous savez que vos plages sont de taille fixe, vous pouvez toujours faire switch(variable / FIXED_SIZE_OF_RANGE){ case 0: ... default: break; }
Vous devez vous connecter pour publier un commentaire.
Malheureusement, il n'est pas possible en Java. Vous devrez recourir à l'aide de
if-else
consolidés.if/elseif/else
états, indépendamment de la langue.if
ouswitch
c'est sur l'utilisation deif
ouswitch
états avec des dizaines ou des centaines de solutions de rechange cas. La question en fait la demande, un bonne alternative., ma réponse est la plus pertinente et OO réponse jusqu'à présent.Swift
a trop. "cas 1 ... 100', oucase 1 ..< 101
.Golang
aussi l'avoir. tour.golang.org/flowcontrol/11 (9, 10 et 11 pages)La deuxième option est tout à fait acceptable. Je ne suis pas sûr pourquoi, un intervenant a dit qu'il n'était pas possible. Ce qui est bien, et je le fais tout le temps:
Peut-être pas aussi élégant que certaines réponses précédentes, mais si vous voulez atteindre le commutateur de cas avec quelques grandes plages, il vous suffit de combiner les plages pour un seul cas à l'avance:
case 1
signifievariable == 1
, qui conduit à la confusion et beaucoup de douleur dans le long terme. Si vous avez besoin de placer des commentaires dans votre code afin de le rendre lisible, alors que vous avez fait quelque chose de mal, à mon humble avis.Out:
Src: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
Un Objet Orienté option pour remplacer les trop grandes
switch
etif/else
constructions est d'utiliser unChain of Responsibility Pattern
le modèle de la prise de décision.Modèle chaîne de Responsabilité
Voici un exemple de mise en œuvre qui est également de Type Coffre-fort à l'aide de médicaments Génériques.
C'est un simple homme de paille que je fouettée, en quelques minutes, une version plus sophistiquée de la mise en œuvre pourrait permettre une sorte de
Command Pattern
à être injectés dans leCase
implémentations cas pour la rendre plus d'un appel de retour Cio style.Une fois la bonne chose à propos de cette approche est que le Commutateur de Cas, les états sont tous sur les effets secondaires, cela résume les effets secondaires dans les Classes de sorte qu'ils peuvent être gérés, et ré-utilisés mieux, il finit par n'être plus comme le Modèle Correspondant dans un langage Fonctionnel et qui n'est pas une mauvaise chose.
Je vais poster des mises à jour ou des améliorations de ce Gist sur Github.
En gros:
Si vous avez vraiment besoin d'utiliser un commutateur, ce serait parce que vous avez besoin de faire différentes choses pour certaines gammes. Dans ce cas, oui, vous allez avoir le code désordre, parce que les choses sont plus complexes et que des choses suivre les tendances vont de compression.
La seule raison pour un interrupteur pour économiser sur les tapant le nom de la variable si vous êtes juste des tests pour numériques de commutation valeurs. Vous n'allez pas à passer sur 100 choses, et ils ne vont pas tous faire la même chose. Cela sonne plus comme un "si", morceau.
Selon cette question, il est tout à fait possible.
Il suffit de mettre tous cas qui contiennent la même logique d'ensemble, et ne pas mettre
break
derrière eux.C'est parce que
case
sansbreak
de passer à un autrecase
jusqu'àbreak
oureturn
.EDIT:
Répondre au commentaire, si vraiment nous avons 95 les valeurs avec la même logique, mais d'une manière plus petit nombre de cas, avec une logique différente, nous pouvons faire:
Si vous avez besoin d'un contrôle plus précis,
if-else
est le choix.case
états!). J'ai peur, je suis d'accord avec la accepté de répondre.//Non Conforme À L'Exemple De Code
//Solution Conforme À La
Il est possible de gérer cela à l'aide de Vavr bibliothèque
Bien sûr ce n'est qu'une légère amélioration depuis tous les cas, doivent être indiqués explicitement. Mais il est facile de définir un prédicat:
Match est une expression donc, ici, il renvoie à quelque chose comme
Runnable
exemple au lieu d'invoquer des méthodes directement. Après match est effectuéeRunnable
peut être exécutée.Pour plus de détails, veuillez voir la documentation officielle.
pour alternative, vous pouvez utiliser comme ci-dessous:
ou le code suivant fonctionne aussi
À partir de la dernière java-12 la libération de plusieurs constantes dans le même cas l'étiquette est disponible dans aperçu de fonctionnalité
Il ressemble:
Voir plus JEP 325: Commutateur Expressions (Extrait)
Une alternative au lieu d'utiliser les valeurs codées en dur pourrait être à l'aide de gamme mappages sur l'instruction switch à la place: