Switch Expressions no JDK12

Jeyvison Nascimento
Liferay Engineering Brazil
3 min readMar 29, 2019

o Java Development Kit 12 foi disponibilizado a algumas semanas para download. Entre suas novidades podemos encontrar o novo Switch Expression, em modo de Preview.

Da forma como é hoje, o comando switch segue fielmente linguagens como C e C++, dando suporte á cascata por padrão, por exemplo.
Enquanto essa forma é frequentemente util para se escrever código em baixo nivel (como parsers), é necessária uma maior flexibilidade para códigos em alto nível.

Por exemplo, no código a seguir, os vários comandos “break” tornam esse código desnecessariamente verboso, e esse ruído visual geralmente mascara erros difíceis de debugar, onde comandos “break” ausentes podem se traduzir numa cascata acidental.

Foi introduzida com essa nova feature uma nova forma de label, escrito como “case L ->” que significa que apenas o código á direita do label será executado.

O exemplo acima também usa labels de case mutiplos, separados por virgula.

O código á direita de um “case -> L” é restrito para ser uma expressão, um block ou um throw. A consequência é que se um ramo declarar uma variável local essa variável ficará contida apenas no bloco, e não no escopo de todo o comando switch. Isso elimina uma das desvantagens dos blocos
do switch tradicional onde o escopo da variável local é o bloco switch inteiro.

Muitos comandos switch são essencialmente simulações de switch expressions, onde cada ramo define o valor de uma variável comum ou retorna um valor.

Expressar esse tipo de situação dessa forma é tortuoso, repetitivo e propenso a falhas. Usar switch expression nesse cenário, torna a operação muito mais clara e segura:

A comando switch foi extendido para adionalemnte ser usado como uma expressão. No caso comum, o switch expression pode ser resumido a isso:

O Switch Expression é uma poli-expressão; se o tipo do target é conhecido , esse tipo é enviado pra cada ramo. O tipo da expressão switch é o tipo to target, se conhecido; se não, um tipo standalone é computado combinando os tipos de cada ramo.
A maioria dos switch expressions terão apenas uma expressão no lado direito do label “case L -> “. No evento de que um bloco inteiro é necessário, o comando "break" foi extendido para receber um argumento, que se torna o retorno da expressão.

Um switch expression pode, como um comando switch, também usar um block tradicional com labels “case L:”. Nesse caso os valores são retornados com o comando “break”.

As duas formas de “break” (com e sem valor) são analogas ás duas forms de retorno nos métodos. As duas formas de retorno terminam a excução do método imediatamente; em um método não-void, adicionalmenteum valor deve ser provido o qual é retornado á quam invocou o método.
Um switch expression deve completar normalmente com um valor ou lançar uma exceção. O compilador checa cada label para verificar se um valor pode ser retornado.

Um consequencia disso é que não é possivel pular (goto) a partir um switch expression, como no exemplo abaixo:

O switch expression deve entrar como uma feature definitiva a partir do JDK13. Você pode fazer o downlaod do JDK 12 aqui. Esse artigo é uma tradução e adaptação livre da JEP 325.

--

--