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