27 de setembro de 2021

O novo (mas nem tanto) switch/case do Java

Recentemente voltei a mexer mais com Java devido ao trabalho e também alguns conteúdos que eu estava acompanhando que utilizam a linguagem. Como estou utilizando o IntelliJ como IDE ela sugeriu algo muito interessante e que passei adotar sempre que posso, o nova sintaxe do switch/case.

A instrução switch case comum do Java segue algo muito similar a já implementada no C, um exemplo simples:

Esta é a estrutura comum que já conhecemos, como você pode ver temos os casos específicos que tratamos, o caso padrão e para que a avaliação do switch/case pare precisamos utilizar a clausula break, o que chega a me dar "gastura" em switch/cases muito grandes. 

Algumas outras linguagens (Rust, Scala e outras) tem uma síntaxe construida sobre casamento de padrões e implementam uma estrutura similar porém um pouco mais expressiva e eficiente. No Java 13 algo similar (mas ainda não tão poderoso) foi incluído e agora podemos ter uma nova síntaxe que utiliza o operador -> (seta) e já mostra a diferença:

Agora já não é mais necessário utilizar o break para encerrar a busca, pois quando houver um caso que seja positivo ele executa e encerra a avaliação. Para casos de avaliação de Enums fica muito interessante, como podemos ver no exemplo abaixo:

O ponto que talvez seja mais interessante é que o switch/case passa a ser também uma expressão, ou seja, pode retornar valores, para isso basta utilizarmos numa atribuição, reduzindo bastante o caso anterior:

Para garantir que a variável fique corretamente preenchida (já pensou caso não batesse com nenhum valor? Seria algo indefinido) é obrigatório avaliar todos os casos, no caso de umde Enums é necessário cobrir todos os casos nem que seja definindo um default. Outros tipos basta incluir um caso default, como String e tipos numéricos.

Nos exemplos anteriores só utilizamos expressões de uma linha nos cases, mas é possível utilizar blocos também para computar algo:

Para retornar um valor para o switch nos casos de blocos utilizamos a palavra yield (que fica similar ao return de uma função).

Ver essa nova sintaxe aliada as novidades que foram incluídas desde o Java 8 irão permitir um código muito mais expressivo e coeso. Além disso no recém lançado Java 17 está sendo incluída uma proposta de casamento de padrões (pattern matching) que irá aumentar ainda mais o poder do switch/case, pois além de avaliar valores também será capaz de avaliar tipos, iremos comentar mais sobre isso em um post futuro.

Nenhum comentário:

Postar um comentário