O Switch Case do Java foi Aprimorado

O recurso Pattern Matching for Switch é uma das funcionalidades do Java 17, que permite usar expressões switch com tipos variados e assim, simplificar o código. Neste post, vamos ver como funciona essa funcionalidade e quais são as suas vantagens.

O que é o Pattern Matching for Switch?

O Pattern Matching for Switch é uma forma de usar o switch para verificar se uma variável ou expressão se encaixa em um determinado padrão, que pode ser um tipo, um valor ou uma combinação de ambos. Por exemplo, podemos usar o switch para verificar se uma variável é uma String, um Integer ou outro tipo, e executar um bloco de código diferente para cada caso.

Antes do Java 17, para fazer isso, teríamos que usar o operador instanceof e fazer um cast explícito da variável para o tipo desejado. Por exemplo:

Object obj = …; // algum valor
if (obj instanceof String) {
    String s = (String) obj; // cast explícito
    // fazer algo com s
} else if (obj instanceof Integer) {
    Integer i = (Integer) obj; // cast explícito
    // fazer algo com i
} else {
    // fazer algo com obj
}

Com o Java 17, podemos usar o switch para fazer o mesmo de forma mais simples e elegante, usando a sintaxe de pattern matching:

public static void process(Object obj) {
    switch (obj) {
        case String s -> System.out.println("É uma string: " + s);
        case Integer i -> System.out.println("É um número inteiro: " + i);
        case Double d -> System.out.println("É um número decimal: " + d);
        default -> System.out.println("Tipo desconhecido");
    }
}

Nesse exemplo, o parâmetro obj é verificado em cada cláusula “case” usando o padrão tipo variável -> expressão.

Se o objeto corresponder ao padrão, a expressão correspondente será executada. Caso contrário, o fluxo de controle passa para o próximo caso ou para a cláusula “default”.

Essa funcionalidade também permite usar “var” para inferir o tipo da variável. Por exemplo:

public static void process(Object obj) {
    switch (obj) {
        case String s -> System.out.println("É uma string: " + s);
        case Integer i -> {
            var doubled = i * 2;
            System.out.println("O dobro do número inteiro é: " + doubled);
        }
        default -> System.out.println("Tipo desconhecido");
    }
}

Além disso, o Pattern Matching for Switch pode ser combinado com outras expressões lógicas, como “or” e “and”, para criar padrões mais complexos. Observe o seguinte exemplo pratico de uso:

public static void process(Object obj) {
    switch (obj) {
        case String s && (s.startsWith("A") | s.startsWith("B")) -> {
            System.out.println("É uma string que começa com A ou B: " + s);
        }
        case Integer i && (i > 0 & i <= 10) -> {
            System.out.println("É um número inteiro entre 1 e 10: " + i);
        }
        case Double d && (d > 10.0 | d < -10.0) -> {
            System.out.println("É um número decimal maior que 10 ou menor que -10: " + d);
        }
        default -> System.out.println("Tipo desconhecido");
    }
}

No código, adicionamos condições mais complexas aos padrões em cada cláusula “case” usando as expressões lógicas “or” e “and”.

No primeiro caso, estamos verificando se a variável s é uma String que começa com “A” ou “B”.

Usamos a expressão (s.startsWith("A") | s.startsWith("B")) para realizar a verificação.

No segundo caso, estamos verificando se a variável i é um Integer que está no intervalo de 1 a 10.

Usamos a expressão (i > 0 & i <= 10) para realizar a verificação.

No terceiro caso, estamos verificando se a variável d é um Double que é maior que 10.0 ou menor que -10.0.

Usamos a expressão (d > 10.0 | d < -10.0) para realizar a verificação.

Essas combinações de expressões lógicas permitem criar padrões mais complexos e específicos para realizar correspondências em casos particulares.

Quais são as vantagens do Pattern Matching for Switch?

O Pattern Matching for Switch traz algumas vantagens para o desenvolvimento em Java, como:

  1. Redução de código repetitivo: Com o Pattern Matching for Switch, é possível evitar a repetição de código ao realizar verificações e extrações de dados em estruturas de dados complexas. Isso resulta em um código mais conciso e limpo.
  2. Legibilidade aprimorada: O uso de padrões nas cláusulas “case” torna o código mais expressivo e legível. Os padrões ajudam a comunicar as intenções do programador de forma mais clara, facilitando a compreensão do código por outros desenvolvedores.
  3. Melhor expressividade: O recurso permite realizar correspondências mais avançadas e expressivas em estruturas de dados complexas. Combinado com expressões lógicas “or” (|) e “and” (&), é possível criar padrões mais sofisticados e específicos, tornando o código mais flexível e adaptável.
  4. Facilidade de manutenção: O Pattern Matching for Switch pode facilitar a manutenção do código, especialmente quando se lida com estruturas de dados que podem evoluir ao longo do tempo. A capacidade de adicionar novos padrões sem afetar as cláusulas “case” existentes ajuda a tornar o código mais extensível.
  5. Detecção de erros em tempo de compilação: O uso de padrões no Pattern Matching for Switch pode ajudar a detectar erros em tempo de compilação, como quando um padrão não é abrangente o suficiente para cobrir todos os casos possíveis. Isso contribui para a segurança do código e evita erros em tempo de execução.
  6. Maior produtividade: Ao reduzir a repetição de código e melhorar a legibilidade, o Pattern Matching for Switch pode aumentar a produtividade dos desenvolvedores. O código mais conciso e expressivo pode acelerar o processo de desenvolvimento e facilitar a manutenção futura.

Essas vantagens tornam o Pattern Matching for Switch uma ferramenta poderosa para lidar com lógica de programação condicional e manipulação de estruturas de dados complexas, contribuindo para um código mais eficiente e robusto.

Conclusão

O Pattern Matching for Switch é uma das novas funcionalidades do Java 17 que facilita o uso do switch com tipos variados e simplifica o código. Neste post, vimos como funciona essa funcionalidade e quais são as suas vantagens. Para saber mais sobre esse recurso acesse o artigo da Oracle Pattern Matching for switch Expressions and Statements.

Ballem

Marcio Ballem é bacharel em Sistemas de Informação pelo Centro Universitário Franciscano em Santa Maria/RS. Tem experiência com desenvolvimento Delphi e Java em projetos para gestão pública e acadêmica. Possui certificação em Java, OCJP 6.

Você pode gostar...