• Skip to primary navigation
  • Skip to content

Mauda

IT, Java and Music

Graduação   SCJP   Mestrado
  • Apresentação
  • Certificação Java
  • JPA
    • Exceptions
  • JSF
  • Versionamento
  • Contato

Switch no Java 7 – Utilizando Strings

January 14, 2019 by Mauda Leave a Comment

Conteúdo do Post:
  1. Histórico
  2. Antes da JDK 7 – Modelo IF-ELSEs
  3. Após a JDK 7 – Utilizando o switch
  4. Como o case compara as Strings por debaixo dos panos
  5. Formas diferentes de instanciar Strings podem modificar a comparação do Case?
  6. Utilizando variáveis Strings para comparar com o Case
  7. finnaly{

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:

Java
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:

Java
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:

Java
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:

Java
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:

Java
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:

Java
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:

Java
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!

Filed Under: Java, String Tagged With: java 7, String, switch

About Mauda

Mestre em Informática, Analista de Sistemas, Professor, SCJP e Baterista. Desde 2002 trabalhando no mundo Java e ensinando pessoas sobre desenvolvimento de sistemas. Mais informações

Reader Interactions

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Advertisements

Copyright © 2026 · Genesis Framework · WordPress · Log in