Apenas tentando descobrir como usar vários casos múltiplos para uma instrução switch Java. Aqui está um exemplo do que estou tentando fazer:
switch (variable)
{
case 5..100:
doSomething();
break;
}
versus ter que fazer:
switch (variable)
{
case 5:
case 6:
etc.
case 100:
doSomething();
break;
}
Alguma ideia, se possível, ou qual é uma boa alternativa?
java
syntax
switch-statement
FunJavaCode
fonte
fonte
Respostas:
Infelizmente, não é possível em Java. Você terá que recorrer ao uso de
if-else
declarações.fonte
if/elseif/else
instruções aninhadas , independentemente do idioma.A segunda opção está perfeitamente bem. Não sei por que um respondente disse que não era possível. Isso é bom, e eu faço isso o tempo todo:
fonte
Fora:
Src: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
fonte
Talvez não seja tão elegante quanto algumas respostas anteriores, mas se você deseja obter casos de switch com poucos intervalos grandes, basta combinar os intervalos para um único caso de antemão:
fonte
case 1
significavariable == 1
, o que leva a confusão e muita dor a longo prazo. Se você precisa colocar comentários em seu código para torná-lo legível, então você fez algo errado IMHO.Uma opção orientada a objeto para substituir construções
switch
eif/else
construções excessivamente grandes é usar umChain of Responsibility Pattern
para modelar a tomada de decisão.Padrão de Cadeia de Responsabilidade
Aqui está um exemplo de implementação que também é de tipo seguro usando genéricos.
Este é apenas um espantalho rápido que preparei em alguns minutos, uma implementação mais sofisticada pode permitir que algum tipo de
Command Pattern
injeção noCase
instâncias de implementação para torná-lo mais um estilo de retorno de chamada IoC.Uma coisa boa sobre essa abordagem é que as instruções Switch / Case são todas sobre efeitos colaterais, isso encapsula os efeitos colaterais em classes para que possam ser gerenciados e reutilizados melhor, acaba sendo mais parecido com a correspondência de padrões em uma linguagem funcional e isso não é uma coisa ruim.
Vou postar quaisquer atualizações ou melhorias para este Gist no Github.
fonte
De acordo com essa pergunta , é totalmente possível.
Basta colocar todos os casos que contêm a mesma lógica juntos e não colocá-
break
los atrás deles.É porque
case
sembreak
vai pular para outrocase
atébreak
oureturn
.EDITAR:
Respondendo ao comentário, se realmente temos 95 valores com a mesma lógica, mas um número bem menor de casos com lógica diferente, podemos fazer:
Se você precisa de um controle mais preciso,
if-else
é a escolha.fonte
case
instruções!). Receio concordar com a resposta aceita.Basicamente:
Se você realmente precisasse usar um switch, seria porque precisa fazer várias coisas para certos intervalos. Nesse caso, sim, você terá um código confuso, porque as coisas estão ficando complexas e apenas as coisas que seguem padrões irão compactar bem.
A única razão para uma troca é economizar ao digitar o nome da variável se você estiver apenas testando os valores de comutação numéricos. Você não vai ligar 100 coisas, e elas não vão estar todas fazendo a mesma coisa. Isso soa mais como um pedaço "se".
fonte
// Exemplo de código não compatível
// Solução compatível
fonte
Desde a última versão do java-12, várias constantes no mesmo rótulo de caixa estão disponíveis no recurso de linguagem de visualização
Parece:
Veja mais JEP 325: Switch Expressions (Preview)
fonte
É possível lidar com isso usando a biblioteca Vavr
É claro que isso é apenas uma pequena melhoria, já que todos os casos ainda precisam ser listados explicitamente. Mas é fácil definir o predicado personalizado:
Match é uma expressão, então aqui ela retorna algo como
Runnable
instância em vez de invocar métodos diretamente. Após a partida ser realizadaRunnable
pode ser executada.Para obter mais detalhes, consulte a documentação oficial .
fonte
como alternativa, você pode usar como abaixo:
ou o código a seguir também funciona
fonte
JEP 354: Switch Expressions (Preview) em JDK-13 e JEP 361: Switch Expressions (Standard) em JDK-14 irá estender a instrução switch para que possa ser usada como uma expressão .
Agora você pode:
case L ->
):Alternar exemplo de expressão:
fonte
Uma alternativa em vez de usar valores embutidos em código poderia ser usar mapeamentos de intervalo na instrução switch:
fonte