Top 5 novidades do Java 14

Cayo Souza
Mar 17, 2020 · 7 min read

Introdução

Hoje, 17 de março de 2020, está sendo lançada a versão 14 do Java trazendo mais JEPs (Java Enhancement Proposals) que as duas últimas versões (12 e 13) juntas!

Das 16 JEPs contidas nesta versão, estarei abordando as 5 (em ordem crescente do número das JEPs) que estão sendo mais comentadas.

Antes de continuar, gostaria de explicar a nomenclatura “preview”, que são features em que a arquitetura, especificação e implementação estão completas mas ainda não estão em seu estado final. E na prática isto significa que esta feature pode ser alterada ou descontinuada em futuras versões da linguagem.

Então sem mais delongas, vamos às novidades!

Pattern Matching for instanceof (Preview) [JEP 305]

Pattern Matchings” são sintaxes convenientes para extrair componentes de objetos baseado em condições específicas.

Esta JEP tem como objetivo diminuir a verbosidade do uso do “instanceof”, que testa o tipo de uma classe, através da remoção da necessidade de “casts” explícitos.

O código a seguir é muito comum quando usamos o instanceof:

Nele observamos que 3 coisas estão sendo feitas: um teste (if), uma conversão (casting pra String) e declaração de variável (s).

Com o pattern matching este mesmo resultado pode agora ser obtido da seguinte forma:

Em apenas uma linha conseguimos fazer estas mesmas 3 coisas de uma só vez!

Esta mudança permitirá a remoção de muitos casts redundantes já que, segundo este artigo científico, 24% de todos os casts procedem instanceofs.

Esta JEP também aponta um outro exemplo, desta vez no famoso método “equals”, que usamos para comparar objetos, que antes era escrito assim:

E após aplicar o pattern ficou assim:

Sem dúvidas este é um ótimo preview e pode ser só o começo de muitos outros patterns!

Helpful NullPointerExceptions [JEP 358]

Este camarada dispensa comentários, o erro mais conhecido e uns dos mais comuns do Java. O NPE (Null Pointer Exception) é lançado quando tentamos acessar alguma informação de um objeto nulo.

Atualmente a JVM (Java Virtual Machine) nos informa a linha da origem do problema, por exemplo:

Irá lançar o NPE:

A única informação que temos é que ocorreu na linha 5. Mas foi causado pelo “a” ou “b”? A partir de hoje saberemos:

Ficou claro que o NPE está sendo causado pelo “b”!

E ganhamos duas novas informações: a causa: “a.b is null” — e a consequência: “Cannot read field c”.

O mesmo se aplica aos outros meios que lançam NPE, como vetores:

Mas atenção! Esta mensagem não virá habilitada por padrão, necessitando passar como parâmetro ao executar o código a seguinte flag:

Por exemplo:

Uma excelente novidade para o “debug” nosso de cada dia!

Records (Preview) [JEP 359]

Um novo “preview” que também ataca a verbosidade de maneira brutal. Records prometem reduzir drasticamente as linhas de código associadas às classes que só armazenam dados, também conhecidas como POJO (Plain Old Java Object) ou classes do Model (em arquiteturas MVC).

Antes de mais explicações vamos ao exemplo, uma classe Ponto com atributos x e y:

Esta linha de código simplesmente equivale a:

O record equivale a uma classe com:

  • Um atributo privado e final para cada argumento informado;
  • Um construtor público que utiliza todos os argumentos;
  • Getters;
  • toString;
  • equals e hashCode

Para habilitar este preview, use a seguinte flag:

Esta sem dúvida é uma das maiores novidades desta versão e algo bem aguardado, que já existia em outras linguagens como os Case Classes do Scala.

Apesar de já existirem alternativas no Java como o Lombok, que faz algo similar com o uso de anotações (@Data por exemplo), ter uma opção nativa é muito mais interessante.

Switch Expressions [JEP 361]

As expressões switch estavam em preview em versões anteriores e agora adquiriram seu estado final.

Para refrescar a memória, um switch clássico seria escrito desta maneira:

Agora podemos escrever assim:

Mais uma abordagem que ataca a verbosidade!

Mas não para aí, o switch deixou de ser um “statement” para se tornar uma “expression. Na prática, o código a seguir, apesar de usar a sintaxe do novo switch, também poderia ser escrito com o switch antigo:

Mas com a nova natureza de expressão agora podemos refatorar este método passando o switch como parâmetro do println, algo que antes não era possível:

Uma outra novidade do switch é “yield”. Ele foi criado para servir um valor quando um bloco inteiro de código for necessário. Por exemplo:

Como no “default” precisamos abrir parêntesis (criar um bloco), o yield se faz necessário para retornar o “result” este então é atribuído ao “j”.

Com esta mudança certamente teremos um aumento no uso do switch, que vinha sendo deixado de lado pela sua estrutura verbosa, datada, propensa a erros e de funcionalidade não muito diferenciada, tendo em vista outros controladores de fluxo.

Text Blocks (Second Preview) [JEP 368]

Por último temos o segundo preview dos “Text Blocks.

Frequentemente escrevemos Strings com quebras de linhas, principalmente por motivos de estética e boas práticas. Os blocos de texto oferecem uma abordagem mais adequada para estes casos:

Tomemos este código com diversos “+” para concatenação, e “\n” para quebra de linha:

Agora utilizando a sintaxe dos blocos de texto:

E esta query (que já é poluída o suficiente só com os acentos graves):

Fica:

Mas isso já existia desde o primeiro preview. A novidade do Java 14 é a introdução das duas novas sequências de escape:

  • \” no final da linha;
  • e “\s

O “\s” simplesmente se traduz para um espaço simples (\u0020). O “\s” pode ser usado tanto em blocos de texto como em Strings tradicionais.

Já o “\” no final da linha evita a quebra da mesma, exemplo:

Poderá ser escrito agora:

Um último detalhe a se acrescentar é que blocos de texto podem ser usados em qualquer lugar que uma String tradicional pode ser usada, inclusive concatenando:

Entretanto esta prática pode prejudicar a legibilidade do código como já é perceptível. E piora se colocarmos uma variável no meio disso tudo.

Mas se mesmo assim você preferir usar esta mistura de sintaxes, há uma alternativa mais limpa:

Utilizando o “replace”, “format” ou até mesmo “formatted” da classe String.

Conclusão

Este foi o meu top 5 das mudanças do Java 14!

Espero que este empenho em reduzir a característica verborrágica do Java continue, já que ela é tida como uma das grandes desvantagens da linguagem — mesmo que desde o Java 8 venha sendo mitigada em ritmo acelerado a cada novo release!

Para ver todas as outras 11 JEPs que não foram citadas neste artigo, acesse a página oficial.

Fontes:
https://openjdk.java.net/projects/jdk/14/
https://blogs.oracle.com/javamagazine/java-14-arrives-with-a-host-of-new-features
http://www.cs.williams.edu/FTfJP2011/6-Winther.pdf

Meu nome é Cayo Souza, sou Desenvolvedor Fullstack, entusiasta Java & Spring, apreciador de novas tecnologias e boas práticas de código. Acredito que o compartilhamento de conhecimento é a chave da evolução.

A Mobicare e a Akross combinam os Melhores Talentos, Tecnologias de Ponta, Práticas Agile e DevOps com Capacidades Operacionais avançadas para ajudar Operadoras Telecom e grandes empresas a gerarem novas receitas e a melhorarem a experiência dos seus próprios clientes.

Se você gosta de inovar, trabalhar com tecnologia de ponta e está sempre buscando conhecimento, somos um match perfeito!

Faça parte do nosso time. 😉

mobicareofficial

Se você gosta de inovar, trabalhar com tecnologia de ponta…

mobicareofficial

Se você gosta de inovar, trabalhar com tecnologia de ponta e está sempre buscando conhecimento, somos um match perfeito! Vem trabalhar com a gente 😉 bit.ly/mobicarreiras

Cayo Souza

Written by

Desenvolvedor na Mobicare e viciado em jogos online

mobicareofficial

Se você gosta de inovar, trabalhar com tecnologia de ponta e está sempre buscando conhecimento, somos um match perfeito! Vem trabalhar com a gente 😉 bit.ly/mobicarreiras