interruptor, caso, padrão - 1

"Olá, amigo!"

"Oi, Bilaabo! Que bom ver você de novo. Apenas suas palestras são tão boas e compreensíveis. Não como este modelo de memória Java."

"Sim, Bilaabo sabe como escolher as aulas. Hoje vou falar sobre a declaração de troca."

"Eu acho que alguém já me contou sobre isso."

"Ellie fez. Então, Amigo não quer ouvir uma lição sobre a declaração de troca? Talvez você comece a ensinar a sua própria?"

"Não, eu quero, eu quero. Vamos ouvir sobre a declaração de troca."

"OK. Em Java, existe algo chamado switch. É conveniente quando você precisa executar determinadas ações dependendo de vários valores de alguma variável."

Exemplo com interruptor código equivalente
int i = 5;
switch(i)
{
 case 1:
  System.out.println("one");
  break;
 case 2:
  System.out.println("two");
  break;
 case 3:
  System.out.println("three");
  break;
 default:
  System.out.println("many");
}
int i = 5;
if (i == 1)
{
 System.out.println("one");
}
else if (i == 2)
{
 System.out.println("two");
}
else if (i == 3)
{
 System.out.println("three");
}
else
{
 System.out.println("many");
}

A instrução switch permite pular para o trecho de código desejado se a variável passada para ela corresponder ao valor que segue a palavra-chave case.

Se i for 1, a execução saltará para a linha marcada como «caso 1».

Se i for 2, a execução saltará para a linha marcada como «caso 2».

Se i for 3, a execução saltará para a linha marcada como «caso 3».

"Se não houver salto para nenhum dos casos, o bloco «default» será executado."

"Entendo. E à direita está a mesma lógica, mas implementada usando instruções if?"

"Sim."

"E o que há com a palavra 'break'? Você disse que só pode ser usado em loops?"

"Sim, e aqui. Quando a instrução break é executada, saímos imediatamente do switch ."

"Mas se a instrução break for removida, todas as linhas dentro do switch serão executadas até o final."

Exemplo Saída (para i = 1) Saída (para i = 2)
switch(i)
{
 case 1:
  System.out.println("one");
 case 2:
  System.out.println("two");
 case 3:
  System.out.println("three");
 default:
  System.out.println("many"); }
um
dois
três
muitos
dois
três
muitos

"Na verdade, case é um rótulo no código. Na instrução switch, saltamos para o próximo rótulo e começamos a executar todo o código até o final do switch ou até encontrarmos uma instrução break."

"Então, se não escrevermos break, a linha para a qual pularmos será executada, seguida por todas as outras linhas até a chave de fechamento. Certo?"

"Sim."

"Pedaço de bolo. Mas eu gosto de usar instruções if melhor. Eles não têm essas instruções break inúteis."

"É verdade que as instruções if costumam ser mais compactas. Mas uma instrução switch às vezes é mais legível."

"Comparar:"

Exemplo com interruptor código equivalente
public String getName(int i)
{
 switch(i)
 {
  case 1:
   return "one";
  case 2:
   return "two";
  case 3:
   return "three";
  default:
   return "many";
}
public String getName(int i)
{
 if (i == 1)
  return "one";

 if (i == 2)
  return "two";

 if (i == 3)
  return "three";

return "many"
}

"Eu não diria que é mais legível."

"Ok, mas e esse exemplo?"

Exemplo com interruptor código equivalente
public String getName(int i)
{
 switch(i)
 {
  case 1:
  case 2:
   return "one or two";
  case 3:
  case 4:
  case 5:
   return "three to five";
  default:
   return "many";
}
public String getName(int i)
{
 if (i == 1 || i == 2)
  return "one or two";

 if (i == 3 || i == 4 || i == 5)
  return "three to five";

return "many"
}

"Bilaabo, seu exemplo não parece muito certo. Então, posso omitir a instrução break se usar return?"

"Isso mesmo. Uma instrução de retorno sairá imediatamente do método."

"Parece que as instruções if são sempre mais compactas. Mas a instrução switch acabou sendo mais legível desta vez."

"Ufa, finalmente."

"Mais uma coisa. Você não precisa escrever padrão no final. Se não o fizer, simplesmente nada acontecerá se nenhum dos rótulos corresponder."

"Uh, exatamente. Como if-else, mas legível - muito mais legível!"

"Ótimo. Estou feliz que você gostou da minha aula."

"Ah, quase esqueci. Inicialmente, você só podia usar tipos primitivos e enums em instruções switch. Mas agora eles adicionaram suporte para Strings."

"Você quer dizer que eu escrevo isso?"

Exemplo
public int getNumber(String number)
{
 switch(number)
 {
  case "one":
   return 1;
  case "two":
   return 2;
  case "three":
   return 3;
  default:
   return -1;
 }
}

"Sim. Conveniente, certo?"

"Sim. As instruções de troca são ótimas!"