Solo estoy tratando de descubrir cómo usar muchos casos múltiples para una declaración de cambio de Java. Aquí hay un ejemplo de lo que estoy tratando de hacer:
switch (variable)
{
case 5..100:
doSomething();
break;
}
versus tener que hacer:
switch (variable)
{
case 5:
case 6:
etc.
case 100:
doSomething();
break;
}
¿Alguna idea si esto es posible, o cuál es una buena alternativa?
java
syntax
switch-statement
FunJavaCode
fuente
fuente
Respuestas:
Lamentablemente, no es posible en Java. Tendrás que recurrir al uso de
if-else
declaraciones.fuente
if/elseif/else
declaraciones anidadas , independientemente del idioma.La segunda opción está completamente bien. No estoy seguro de por qué un respondedor dijo que no era posible. Esto está bien, y hago esto todo el tiempo:
fuente
Fuera:
Src: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
fuente
Tal vez no sea tan elegante como algunas respuestas anteriores, pero si desea lograr casos de cambio con pocos rangos grandes, simplemente combine los rangos en un solo caso de antemano:
fuente
case 1
significavariable == 1
, lo que genera confusión y mucho dolor a largo plazo. Si necesita colocar comentarios en su código para que sea legible, entonces hizo algo mal en mi humilde opinión.Un objeto opción orientada a reemplazar excesivamente grande
switch
yif/else
construcciones es utilizar unaChain of Responsibility Pattern
para modelar la toma de decisiones.Patrón de cadena de responsabilidad
A continuación, se muestra una implementación de ejemplo que también es Type Safe usando genéricos.
Este es solo un hombre de paja rápido que preparé en unos minutos, una implementación más sofisticada podría permitir
Command Pattern
que se inyecte algún tipo deCase
implementación instancias de implementación para que sea más un estilo de devolución de llamada de IoC.Una vez que lo bueno de este enfoque es que las declaraciones Switch / Case tienen que ver con los efectos secundarios, esto encapsula los efectos secundarios en las clases para que se puedan administrar y reutilizar mejor, termina siendo más como Pattern Matching en un lenguaje funcional y eso no es malo.
Publicaré cualquier actualización o mejora de este Gist en Github.
fuente
Según esta pregunta , es totalmente posible.
Simplemente ponga todos los casos que contienen la misma lógica juntos, y no los deje
break
atrás.Es porque
case
sinbreak
saltará a otrocase
hastabreak
oreturn
.EDITAR:
Respondiendo al comentario, si realmente tenemos 95 valores con la misma lógica, pero un número mucho menor de casos con lógica diferente, podemos hacer:
Si necesita un control más fino,
if-else
es la elección.fuente
case
declaraciones!). Me temo que estoy de acuerdo con la respuesta aceptada.Básicamente:
Si realmente necesitara usar un interruptor, sería porque necesita hacer varias cosas para ciertos rangos. En ese caso, sí, tendrá un código desordenado, porque las cosas se están volviendo complejas y solo las cosas que siguen patrones se comprimirán bien.
La única razón para un cambio es ahorrar al escribir el nombre de la variable si solo está probando valores de cambio numéricos. No vas a encender 100 cosas y no van a hacer todas lo mismo. Eso suena más como un fragmento de 'si'.
fuente
// Ejemplo de código no conforme
// Solución compatible
fuente
Desde la última versión de java-12, varias constantes en la misma etiqueta de caso están disponibles en la función de idioma de vista previa
Parece que:
Ver más JEP 325: Cambiar expresiones (vista previa)
fuente
Es posible manejar esto usando la biblioteca Vavr
Por supuesto, esto es solo una pequeña mejora, ya que todos los casos deben enumerarse explícitamente. Pero es fácil definir un predicado personalizado:
Match es una expresión, por lo que aquí devuelve algo como
Runnable
instancia en lugar de invocar métodos directamente. Después de que se realiza el partidoRunnable
puede ejecutar.Para más detalles, consulte la documentación oficial .
fuente
como alternativa, puede utilizar de la siguiente manera:
o el siguiente código también funciona
fuente
JEP 354: Expresiones de cambio (vista previa) en JDK-13 y JEP 361: Expresiones de cambio (estándar) en JDK-14 ampliarán la declaración de cambio para que pueda usarse como una expresión .
Ahora usted puede:
case L ->
):Ejemplo de cambio de expresión:
fuente
Una alternativa en lugar de usar valores codificados de forma rígida podría ser usar asignaciones de rango en la declaración de cambio:
fuente