1. O operador de múltipla escolha:switch

Java tem outro operador interessante que herdou de seu avô (C++). Estamos falando da switchdeclaração. Também poderíamos chamá-lo de operador de múltipla escolha. Parece um pouco complicado:

switch(expression)
{
   case value1: code1;
   case value2: code2;
   case value3: code3;
}

Uma expressão ou variável é indicada entre parênteses. Se o valor da expressão for value1, a máquina Java começa a executar code1. Se a expressão for igual a value2, a execução salta para code2. Se a expressão for igual a value3, então code3é executado.

Exemplo:

Código Saída do console
int temperature = 38;

switch(temperature)
{
   case 36: System.out.println("Low");
   case 37: System.out.println("Normal");
   case 38: System.out.println("High");
} 
High

2. breakdeclaração emswitch

Uma característica importante de uma switchinstrução é que o programa simplesmente pula para a linha necessária (para o bloco de código necessário) e, em seguida, executa todos os blocos de código até o final do arquivo switch. Não apenas o bloco de código correspondente ao valor no switch, mas todos os blocos de código até o final do switch.

Exemplo:

Código Saída do console
int temperature = 36;

switch(temperature)
{
   case 36: System.out.println("Low");
   case 37: System.out.println("Normal");
   case 38: System.out.println("High");
} 
Low
Normal
High

Dada uma temperatura de 36, o programa inserirá a switchinstrução, pulará e executará o primeiro bloco de código (o primeiro caso) e, em seguida, executará alegremente o restante dos blocos de código.

Se você quiser executar apenas um bloco de código — o bloco de código associado ao caso correspondente —, será necessário encerrar o bloco com uma breakinstrução;

Exemplo:

Código Saída do console
int temperature = 36;

switch(temperature)
{
   case 36:
      System.out.println("Low");
      break;
   case 37:
      System.out.println("Normal");
      break;
   case 38:
      System.out.println("High");
}
Low

Você pode omitir o breakno último caso da switchinstrução, já que esse bloco é o último com ou sem uma instrução break.


3. Ação padrão:default

Outro ponto importante. O que acontece se nenhum dos casos listados corresponder switchà expressão entre parênteses?

Se um caso correspondente não for encontrado, o restante da switchinstrução será ignorado e o programa continuará a execução após a chave terminar a switchinstrução.

Dito isso, você também pode fazer uma switchinstrução se comportar como a ramificação else em uma if-elseinstrução. Para fazer isso, use a defaultpalavra-chave.

Se nenhum dos cases no switchbloco corresponder ao valor da expressão e switchtiver um defaultbloco, o bloco padrão será executado. Exemplo:

Código Saída do console
int temperature = 40;
switch(temperature)
{
   case 36:
      System.out.println("Low");
      break;
   case 37:
      System.out.println("Normal");
      break;
   case 38:
      System.out.println("High");
      break;
   default:
      System.out.println("Call an ambulance");
}
Call an ambulance

4. Comparando switcheif-else

A switchdeclaração é um pouco semelhante a uma if-elsedeclaração, apenas mais complicada.

Você sempre pode reescrever o código de uma switchinstrução como várias ifinstruções. Exemplo:

Código com interruptor Código com if-else
int temperature = 40;
switch(temperature)
{
   case 36:
      System.out.println("Low");
      break;
   case 37:
      System.out.println("Normal");
      break;
   case 38:
      System.out.println("High");
      break;
   default:
      System.out.println("Call an ambulance");
} 
int temperature = 40;

if (temperature == 36)
{
   System.out.println("Low");
}
else if (temperature == 37)
{
   System.out.println("Normal");
}
else if (temperature == 38)
{
   System.out.println("High");
}
else
{
   System.out.println("Call an ambulance");
}

O código à esquerda funcionará exatamente da mesma forma que o código à direita.

Uma cadeia de várias if-elseinstruções é preferível quando uma ifinstrução contém várias expressões complexas em cada caso separado.



5. Quais expressões podem ser usadas em uma switchdeclaração?

Nem todos os tipos podem ser usados ​​como caserótulos em uma switchinstrução. Você pode usar literais dos seguintes tipos:

  • tipos inteiros: byte, short, int,long
  • char
  • String
  • qualquer enumtipo

Você não pode usar nenhum outro tipo como rótulo de caso.

Exemplo de uso de um enumdentro de uma switchinstrução:

Day day = Day.MONDAY;
switch (day)
{
   case MONDAY:
      System.out.println("Monday");
      break;
   case TUESDAY:
      System.out.println("Tuesday");
      break;
   case WEDNESDAY:
      System.out.println("Wednesday");
      break;
   case THURSDAY:
      System.out.println("Thursday");
      break;
   case FRIDAY:
      System.out.println("Friday");
      break;
   case SATURDAY:
      System.out.println("Saturday");
      break;
   case SUNDAY:
      System.out.println("Sunday");
      break;
}

Observação: se você usar um enumdentro de uma switchinstrução, não precisará escrever o nome da classe na frente de cada valor nos caserótulos. Basta escrever o valor.