Java 21: atualizações, pontos de atenção e tudo que você precisa saber

Itaú Tech
ItauTech
Published in
7 min readSep 27, 2023

--

Por Sérgio Lopes, Domain Expert de Identidade e Autenticação na Comunidade Integrada de Shared Experiences PF do Itaú

No lado esquerdo da imagem, há a frase “Novidades do Java 21: atualizações e pontos de atenção sobre a nova versão da linguagem mais utilizada no mercado”, sobre um fundo azul escuro. No lado direito, há a foto de um homem asiático, de óculos com armação preta, trabalhando em frente a um computador. Ele veste uma camisa na cor azul, sobre uma camiseta branca.

Você sabia que o Java é a linguagem de programação mais utilizada no mundo? De acordo com o time da GitHub, ela já ocupa o primeiro lugar do pódio pelo oitavo ano consecutivo, e sua relevância se mantém graças ao fato de que a linguagem, além de ser muito utilizada em aplicações web, encontra muito espaço também em aplicações de inteligência artificial e aprendizado de máquina.

E assim como no mercado, dada a sua versatilidade, o Java também é a linguagem mais utilizada hoje no Itaú! Por isso, vamos abordar neste artigo as principais novidades da sua nova versão, o Java 21, lançada ao longo de setembro.

Dentro da cadência semestral de lançamentos, entramos na janela de dois anos que cobrem as versões LTS (Long Term Support). Então, consequentemente, essa versão é um de Suporte de Longa Duração. Nessa hora, a pessoa desenvolvedora pode estar se perguntando o que a faria dar atenção a esta versão, certo?

Para começar a responder essa pergunta, vou destacar o “record patterns in switch blocks and expressions”, que é um marco para o Java já que podemos considerar que ele agora suporta apropriadamente os padrões para programação funcional, como linguagens como Kotlin, Rust ou C#. Mas antes de seguir a frente com mais detalhes, vamos voltar para 2 anos atrás.

Há dois anos, tivemos o lançamento do Java 17, com algumas features que chamavam a atenção para sua utilização.

Um dos principais motivadores foram as Classes Seladas (Sealed Classes), que nos trouxeram mais segurança e controle sobre a herança de objetos, e o “Java Records” que nos facilitou e muito a vida para criação de objetos de dados imutáveis, provendo implementação automática de métodos comuns.

Então chegamos ao Java 21, e se apenas esta parte de Record Patterns não anima você o suficiente, vem que vou elencar as principais novidades!

Novas dinâmicas e funcionalidades

Temos bastante assunto para falar, então vamos dar uma olhada pela superfície do que temos disponível e que já é um diferencial para pessoas desenvolvedoras. Bateu a curiosidade? Então arrasta pra cima!

Sequenced Collections: para o caso de Coleções de Dados Ordenadas, temos agora uma nova Interface para recuperação do primeiro e último elemento, e para reversão da sequência de dados.

Exemplo de SequencedCollection
 
 interface SequencedCollection<E> extends Collection<E> {
 // new method
 SequencedCollection<E> reversed();
 // methods promoted from Deque
 void addFirst(E);
 void addLast(E);
 E getFirst();
 E getLast();
 E removeFirst();
 E removeLast();
 }

Quer se aprofundar um pouco mais nesta funcionalidade? Fica a indicação deste episódio do Inside Java Newscast, que fala mais sobre Sequenced Collections.

Generational ZGC: podemos contar com um novo modelo de Garbage Collector (GC) para melhorar a performance de nossas aplicações, principalmente aquelas que requerem uso de memória e CP. Isso pois o ZGC mira diminuir os riscos da aplicação na alocação de recursos, diminuir a sobrecarga de memória e de CPU.

Se você quer entender um pouco mais a respeito desse novo algoritmo, minha recomendação é assistir este material do JavaOne 2023 que mostra o funcionamento em detalhes.

Record Patterns: alcançamos aqui o que eu falei no começo deste artigo: essa feature tem um potencial gigantesco para programação funcional, já que permite que eu desconstrua um “Record” sem esforço e assim extraia campos específicos deles, fazendo uso com o “Pattern Matching”.

Exemplo de Record Pattern
 
 if (obj instanceof Point(int x, int y)) {
 System.out.println(x+y);
 }

Pattern Matching for Switch: somando-se aos Padrões para Records, temos a capacidade de usar correspondência de padrões para switch e sofisticar nossos códigos de muitas maneiras:

Exemplo de Pattern Matching for Switch
 
 static String formatterPatternSwitch(Object obj) {
 return switch (obj) {
 case Integer i -> String.format(“int %d”, i);
 case Long l -> String.format(“long %d”, l);
 case Double d -> String.format(“double %f”, d);
 case String s -> String.format(“String %s”, s);
 default -> obj.toString();
 };
 }

Então juntamos esses dois recursos para habilitar um padrão funcional e de Programação Orientada a Dados no Java. Aqui temos um grande potencial dessa versão da linguagem. Para você se aprofundar neste assunto e também se familiarizar, recomendo o artigo do InfoQ sobre Data Oriented Programming Java.

Virtual Threads: e junto a tudo isso, entra também toda a parte do conceito de que as threads não são mais controladas apenas pelo Sistema Operacional, e sim pela Máquina Virtual do Java (JVM), o que aprimora ainda mais a performance das aplicações, consumos de recurso, redução de consumo de memória e a qualidade do código.

Key Encapsulation Mechanism API: pensando em segurança e criptografia, agora temos uma API padrão que nos permite usar a técnica de criptografia KEM, algoritmo que é usado inclusive em criptografias quânticas, uma grande ferramenta para melhorar a segurança dos nossos dados e aplicações. E para você que gostaria de entender um pouco mais da teoria por traz deste mecanismo, segue esse artigo da Cloudfare.

Pontos de atenção

Como não poderia deixar de ser, é claro que existem também alguns pontos de atenção. Entre eles, destacamos dois principais que impactam a migração para essa versão da linguagem.

Depreciação do “Windows 32-bit x86 Port” para Remoção: sim, sabíamos que esse dia chegaria: o suporte ao 32-bits em processadores x86 está terminando para o Java e JVM. Acredito que isso se torne um problema para legados muito antigos, mas vale deixar no radar.

Preparação para desabilitar o Carregamento Dinâmico na JVM: mais um ponto de atenção para quem carrega via código e de maneira dinâmica agentes na JVM. O pessoal do Java enxerga este procedimento como uma brecha de segurança em aplicações, pois permite a mudança do comportamento da JVM de maneira invasiva. Então eles estão começando a avisar que isso não será mais suportado em versões futuras — mas ainda dando tempo para você fazer a implementação correta via parâmetros da JVM.

Se tudo isso ainda não foi o suficiente para atrair sua atenção para pensar em começar a migrar para o Java 21, temos uma lista de coisas para experimentar que ainda estão em fase de incubação ou preview, mas que podem ser o diferencial para o seu código que ainda está por vir, como:

· Vector API (Sixth Incubator)
· String Templates (Preview)
· Unnamed Patterns and Variables (Preview)
· Unnamed Classes and Instance Main Methods (Preview)
· Scoped Values (Preview)
· Foreign Function & Memory API (Third Preview)
· Structured Concurrency (Preview)

Apesar de serem itens que você ainda não irá usar ainda em produção, estudar como eles irão funcionar pode ajudar tanto na evolução da linguagem, quando a estar preparado para o futuro.

Vale lembrar que fora as features que citei acima, ainda temos melhorias no compilador para os Warnings no uso de Serialização de Objetos, e para o uso de conversão de valores indicando possíveis pontos de falha em tempo de compilação, que podem resultar em comportamento anômalo da aplicação. Aliás, a toda versão sempre temos melhorias no compilador.

A parte de documentação com o JavaDoc também tem melhorias e agora podemos ter exemplos de código na documentação sem precisar usar o <pre> e sim por novo tipo de anotação, o @snippet. Outro destaque nessa parte de documentação é a possibilidade de adicionarmos agora funções em JavaScript na documentação para deixá-la mais intuitiva.

Seria possível passarmos por muitas horas falando de melhorias em segurança, performance interna da JVM (Java Virtual Machine), algoritmos de Garbage Collector e tudo que compõe o ecossistema do Java.

No entanto, vamos reforçar o ponto mais importante aqui: o Java segue sendo uma linguagem relevante, cada vez mais atualizada e preparada para os desafios de criarmos aplicações modernas, escaláveis e robustas, então vale a pena seguirmos nesta direção.

E para finalizarmos aqui, eu recomendo a você esse material aqui do Inside Java Newscast mostrando tudo isso que chegou com o Java 21 e um pouco mais!

Existem também melhorias no Java Flight Recorder, em que via comando conseguimos pegar os “PIDs” do sistema do que está rodando dentro da JVM, e através de novos comandos ver o comportamento de memória e CPU sem precisar parar a aplicação para tirar um arquivo de Dump ou abrir o JDK Mission Control, ou alguma ferramenta de profiling — o que facilita nossa vida no momento da análise de problemas.

--

--