J'essaie simplement de comprendre comment utiliser plusieurs cas multiples pour une instruction de commutation Java. Voici un exemple de ce que j'essaie de faire:
switch (variable)
{
case 5..100:
doSomething();
break;
}
plutôt que d'avoir à faire:
switch (variable)
{
case 5:
case 6:
etc.
case 100:
doSomething();
break;
}
Des idées si cela est possible, ou quelle est une bonne alternative?
java
syntax
switch-statement
FunJavaCode
la source
la source
Réponses:
Malheureusement, ce n'est pas possible en Java. Vous devrez recourir à des
if-else
déclarations.la source
if/elseif/else
instructions imbriquées , quelle que soit la langue.La deuxième option est tout à fait correcte. Je ne sais pas pourquoi un répondant a dit que ce n'était pas possible. C'est bien, et je fais ça tout le temps:
la source
En dehors:
Src: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
la source
Peut-être pas aussi élégant que certaines réponses précédentes, mais si vous souhaitez obtenir des boîtiers de commutation avec quelques grandes plages, il suffit de combiner les plages dans un seul cas au préalable:
la source
case 1
signifievariable == 1
, ce qui conduit à la confusion et à beaucoup de douleur à long terme. Si vous devez placer des commentaires dans votre code pour le rendre lisible, vous avez fait quelque chose de mal à mon humble avis.Une option orientée objet pour remplacer des constructions
switch
et desif/else
constructions trop volumineuses consiste à utiliser unChain of Responsibility Pattern
pour modéliser la prise de décision.Modèle de chaîne de responsabilité
Voici un exemple d'implémentation qui est également Type Safe utilisant Generics.
C'est juste un homme de paille rapide que j'ai fouetté en quelques minutes, une implémentation plus sophistiquée pourrait permettre d'
Command Pattern
injecter une sorte deCase
instances instances d'implémentations pour en faire un style de rappel IoC.Une fois que cette approche est intéressante, les instructions Switch / Case concernent uniquement les effets secondaires, cela encapsule les effets secondaires dans les classes afin qu'ils puissent être gérés et mieux réutilisés, cela finit par ressembler davantage à la correspondance de motifs dans un langage fonctionnel et ce n'est pas une mauvaise chose.
Je publierai toutes les mises à jour ou améliorations de ce Gist sur Github.
la source
Selon cette question , c'est tout à fait possible.
Mettez simplement tous les cas qui contiennent la même logique ensemble, et ne les mettez pas
break
derrière.C'est parce que
case
sansbreak
sautera à un autrecase
jusqu'à ce quebreak
oureturn
.ÉDITER:
En réponse au commentaire, si nous avons vraiment 95 valeurs avec la même logique, mais un nombre beaucoup plus petit de cas avec une logique différente, nous pouvons faire:
Si vous avez besoin d'un contrôle plus fin,
if-else
c'est le choix.la source
case
instructions!). J'ai bien peur d'être d'accord avec la réponse acceptée.Fondamentalement:
Si vous aviez vraiment besoin d'utiliser un commutateur, ce serait parce que vous devez faire différentes choses pour certaines plages. Dans ce cas, oui, vous allez avoir du code désordonné, car les choses deviennent complexes et seules les choses qui suivent des modèles vont bien se compresser.
La seule raison d'un changement est d'économiser sur la saisie du nom de la variable si vous ne testez que des valeurs de commutation numériques. Vous n'allez pas activer 100 choses et ils ne feront pas tous la même chose. Cela ressemble plus à un morceau «si».
la source
// Exemple de code non conforme
// Solution conforme
la source
Depuis la dernière version de java-12, plusieurs constantes dans la même étiquette de cas sont disponibles dans la fonction de langue de prévisualisation
On dirait:
Voir plus JEP 325: Switch Expressions (aperçu)
la source
Il est possible de gérer cela en utilisant la bibliothèque Vavr
Il ne s'agit bien sûr que d'une légère amélioration puisque tous les cas doivent encore être répertoriés explicitement. Mais il est facile de définir un prédicat personnalisé:
Match est une expression donc ici, elle renvoie quelque chose comme
Runnable
instance au lieu d'appeler directement des méthodes. Après le matchRunnable
peut être exécuté.Pour plus de détails, veuillez consulter la documentation officielle .
la source
pour l'alternative, vous pouvez utiliser comme ci-dessous:
ou le code suivant fonctionne également
la source
JEP 354: Switch Expressions (Preview) dans JDK-13 et JEP 361: Switch Expressions (Standard) in JDK-14 étendra l' instruction switch afin qu'elle puisse être utilisée comme expression .
Maintenant vous pouvez:
case L ->
):Exemple d'expression de commutateur:
la source
Une alternative au lieu d'utiliser des valeurs codées en dur pourrait être d'utiliser des mappages de plage sur l'instruction switch à la place:
la source