Olá Pessoal, tudo bom?
O switch é uma estrutura de repetição que é utilizada para trocar uma tupla de IF-ELSEs do código por algo mais fácil de ler. A partir do Java 7 a estrutura switch passou a poder ser utilizada com Strings. Esse artigo irá tratar sobre esse ponto.
Histórico
A versão 7 da JDK foi lançada no dia 28 de julho de 2011 e com ela foi introduzido a novidade do switch com Strings. Essa estrutura é caracterizada por promover uma forma mais limpa de realizar comparações de uma String ao invés de construir inúmeros IF-ELSEs.
Antes da JDK 7 – Modelo IF-ELSEs
Antes da versão 7 da JDK, caso você quisesse fazer uma verificação de um valor de uma String, era necessário construir vários IF-ELSEs com o método equals, como mostra o código abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public String getTipoDiaAntesJava7(String diaSemana) { String tipoDia; if("Segunda".equals(diaSemana)) { tipoDia = "Inicio da semana de trabalho"; } else if("Terca".equals(diaSemana) || "Quarta".equals(diaSemana) || "Quinta".equals(diaSemana)) { tipoDia = "Meio da semana de trabalho"; } else if("Sexta".equals(diaSemana)) { tipoDia = "Fim da semana de trabalho"; } else if("Sabado".equals(diaSemana) || "Domingo".equals(diaSemana)) { tipoDia = "Fim de Semana"; } else { throw new IllegalArgumentException("Dia da semana invalido: " + diaSemana); } return tipoDia; } |
Repare que a String literal vem como o objeto que chama o método equals. Por que isso? Para que não ocorra uma NullPointerException, pois a String “Segunda” já existe, mas a diaSemana é garantido que não seja null? Assim é melhor inverter a ordem evitando uma validação de nulo (if (diaSemana != null)).
Após a JDK 7 – Utilizando o switch
Agora vamos construir a mesma validação mas agora utilizando o switch:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public String getTipoDiaAposJava7(String diaSemana) { String tipoDia; switch (diaSemana) { case "Segunda": tipoDia = "Inicio da semana de trabalho"; break; case "Terca": case "Quarta": case "Quinta": tipoDia = "Meio da semana de trabalho"; break; case "Sexta": tipoDia = "Fim da semana de trabalho"; break; case "Sabado": case "Domingo": tipoDia = "Fim de Semana"; break; default: throw new IllegalArgumentException("Dia da semana invalido: " + diaSemana); } return tipoDia; } |
O código utilizando o switch torna mais legível o código, pois todas as opções tratadas estão com após o case. Além disso para caso de OUs (||) basta alinhar cases como ficou as string Terca a Quinta.
A fim de deixar claro em todos os pontos, o break serve para ir ao final do switch, “quebrando” a execução. No caso aqui como não existe um processamento pós-switch poderia ser utilizado return direto, como no exemplo abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public String getTipoDiaAposJava7(String diaSemana) { switch (diaSemana) { case "Segunda": return "Inicio da semana de trabalho"; case "Terca": case "Quarta": case "Quinta": return "Meio da semana de trabalho"; case "Sexta": return "Fim da semana de trabalho"; case "Sabado": case "Domingo": return "Fim de Semana"; default: throw new IllegalArgumentException("Dia da semana invalido: " + diaSemana); } } |
É possível perceber também que não seria mais necessário a variavel local tipoDia e a palavra chave break;
Como o case compara as Strings por debaixo dos panos
Para realizar a comparação das Strings no switch cada cada utiliza-se do método equals() da classe String. Por debaixo dos panos o Java transforma tudo isso em uma sequência de IF-ELSEs. Assim, baseado nos exemplos acima, a comparação será no seguinte formato:
1 |
if(diaSemana.equals("Segunda")){ |
Qual o problema disso? Conforme descrito acima isso irá causar um NullPointerException, pois o Java não possui uma verificação se o diaSemana não é nulo. Isso caracteriza também que não é possível criar um case com o valor null (Case null: ), ok?!? Vai dar erro de compilação!
Formas diferentes de instanciar Strings podem modificar a comparação do Case?
Outro ponto é que ao utilizar o método equals() para realizar a comparação o case torna possível instanciar uma String de algumas formas que a comparação irá funcionar, por exemplo:
1 2 3 4 |
String retorno = getTipoDiaAposJava7("Segunda"); System.out.println("retorno para \"Segunda\": " + retorno); retorno = getTipoDiaAposJava7(new String("Segunda")); System.out.println("retorno para new String(\"Segunda\"): " + retorno); |
O retorno do código acima é o seguinte:
1 2 |
retorno para "Segunda": Inicio da semana de trabalho retorno para new String("Segunda"): Inicio da semana de trabalho |
O retorno será igual pois o equals() compara o conteúdo da String. E não o endereço de memória, que nesse caso seriam diferentes.
Utilizando variáveis Strings para comparar com o Case
Por fim um último ponto legal da estrutura switch aceitar Strings para comparação é que é possível utilizar variáveis Strings para isso, vamos modificar o exemplo anterior:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
final String diaSegunda = "Segunda"; public String getTipoDiaAntesJava7(String diaSemana) { String tipoDia; switch (diaSemana) { case diaSegunda: tipoDia = "Inicio da semana de trabalho"; break; case "Terca": case "Quarta": case "Quinta": tipoDia = "Meio da semana de trabalho"; break; case "Sexta": tipoDia = "Fim da semana de trabalho"; break; case "Sabado": case "Domingo": tipoDia = "Fim de Semana"; break; default: throw new IllegalArgumentException("Dia da semana invalido: " + diaSemana); } return tipoDia; } |
Ao invés de utilizar uma String literal “Segunda“, o código acima passou a utilizar uma variável String chamada diaSegunda que possui o valor “Segunda“. Repare em um ponto extremamente importante, essa variável possui o modificador final, ou seja, seu valor não pode ser alterado após a primeira atribuição. Caso a variável não possua o modificador final, ocorrerá um erro de compilação. Como o case seria confiável se você pudesse modificar o valor dele a toda hora???
finnaly{
Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!
Até um próximo post!
Leave a Reply