Java 22: as atualizações e novas features e da versão mais recente da linguagem

Itaú Tech
ItauTech
Published in
7 min readApr 23, 2024

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

A imagem traz a frase “Java 22: conheça as principais atualizações e funcionalidades da nova versão da linguagem” no lado esquerdo, escrita sobre um fundo azul. Do lado direito, há a foto de um homem asiático, de cabelo curto e preto, trabalhando em um notebook. Ele veste um casaco amarelo.

A versão mais recente da linguagem de programação e plataforma de desenvolvimento mais usada no mundo já está disponível com a política Short Term Support (STS), uma versão de Suporte de Curta Duração.

E antes que você se pergunte qual a vantagem dessa novidade, é importante resgatarmos o contexto: anteriormente a espera por uma nova versão Java levava anos. Agora, temos versões menores sendo lançadas a cada seis meses — e já com diversas melhorias.

Neste artigo, assim como fizemos com o lançamento da versão 21, iremos compartilhar as principais novidades, como as melhorias de desempenho, estabilidade e segurança capazes de ajudar desenvolvedores a aumentar a produtividade, impulsionar a inovação e acelerar o crescimento em suas organizações. Além disso, você entenderá saberá como experimentar os novos recursos, o que inclui aqueles que ainda estão sendo testados em fase de preview.

Introduções feitas, vamos às novidades!

Melhorias, novidades e adaptações

Neste bloco, iremos compartilhar as principais melhorias que a nova versão traz em relação à anterior, além de as demonstrarmos na prática. No Java 21, as Unnamed Variables & Patterns foram introduzidos como recursos em preview. Agora, no Java 22, eles passam a ser features da linguagem, que ainda que possam parecer simples, são muito importantes para a leitura de código, uma vez que facilitam a visualização de variáveis e parâmetros que precisam existir. Vejamos cada uma delas:

Unnamed Variables & Patterns — JEP 456: primeiramente, temos aqui um ponto que endereça a verbosidade do Java. Afinal, quantas vezes você precisou definir variáveis por uma obrigatoriedade imposta pela linguagem, como exceções, parâmetros de lambda function e patterns, por exemplo?

Confira o exemplo de código abaixo:

FileReader fileReader;

{
try {
fileReader = new FileReader("exemplo.txt");
} catch (FileNotFoundException e) {
System.err.println("Arquivo não Encontrado");
}
}

No Java 22, este exemplo de código pode ser mais conciso usando variáveis ​​“sem nome”, o que envolve a substituição do nome da variável por um sublinhado (_):

FileReader fileReader;

{
try {
fileReader = new FileReader("exemplo.txt");
} catch (FileNotFoundException _) {
System.err.println("Arquivo não Encontrado");
}
}

Vamos trazer mais um exemplo, agora usando uma função Lambda. Neste trecho, ocorre declaração de um Objeto Map e uso de Lambda Funciton para preencher um valor na chave ausente:

Map<Integer,String> mapa = new HashMap<>();

mapa.put(1, "um");
mapa.put(2, "dois");
mapa.put(3, null);

String valor = mapa.computeIfAbsent(3, k -> "três");

Repare que o parâmetro k não é necessário, mas é obrigatório declará-lo. Agora no Java 22, é possível refatorar da seguinte maneira:

Map<Integer,String> mapa = new HashMap<>();

mapa.put(1, "um");
mapa.put(2, "dois");
mapa.put(3, null);

String valor = mapa.computeIfAbsent(3, _ -> "três");

Foreign Function & Memory API — JEP 454: há uma melhoria significativa chamada API de função e memória estrangeira. Esse recurso passou por diversas versões de teste nas versões anteriores. Então, bora entender por que essa melhoria é interessante?

Esse novo recurso ajuda os programas Java a trabalharem com códigos e dados que existem fora do sistema, o que exclui a necessidade do uso da ferramenta Java Native Interface (JNI). Com a API, os desenvolvedores podem chamar funções de outras linguagens de programação e acessar com segurança a memória que não é gerenciada pelo Java.

Quem trabalha usando o JNI para lidar com código e dados externos sabe o quanto ele pode ser pouco eficiente. Nesse sentido, a API de função e memória estrangeira é uma boa solução, por ser mais rápida, segura e funcionar em diferentes plataformas. O uso desse recurso permite que desenvolvedores manipulem facilmente diferentes tipos de memória, como memória nativa e memória gerenciada. Além disso, já podemos começar a refatorar o JNI para este novo formato.

Regional Pinning for G1 — JEP 423: se você não refatorou o código para usar o Foreign Function e ainda utiliza o JNI, essa melhoria auxilia o G1GC na redução da latência da chamada. Assim, não é necessário desabilitar o G1 enquanto acessa regiões críticas de memória no JNI.

Launch Multi-File Source-Code Programs — JEP 458: esse recurso é conhecido como “programas de código-fonte de arquivo único” ou “programas de arquivo único” em Java. Tradicionalmente, os programas dessa linguagem são compilados antes da execução. Isso envolve o uso do compilador Java (javac) para converter o código-fonte Java legível por humanos (arquivos .java) em arquivos de bytecode (arquivos .class), que podem ser executados pela Java Virtual Machine (JVM).

No entanto, com a introdução de programas de arquivo único no Java 11, você pode executar diretamente arquivos de código-fonte Java (arquivos .java) sem compilá-los separadamente. Lembrando que o arquivo não pode ter nenhuma dependência externa ou buscar alguma função fora dele mesmo — mas neste momento, para fins de aprendizado, você pode rodar arquivos com dependências de outros.

Funções disponíveis como prévia para a próxima versão

Assim como na versão 21, algumas funções foram disponibilizadas como prévia no Java 22, para que usuários possam testá-las e propor melhorias antes do lançamento oficial. Vamos entender um pouco mais sobre cada uma delas:

Statements before super (…) [Preview] — JEP 447: para conhecermos esse preview, vamos considerar um exemplo em que precisamos realizar alguma validação ou cálculo antes de chamar o construtor da superclasse. Neste exemplo, digamos que queremos converter um determinado ângulo de graus para radianos, antes de passá-lo para o construtor da superclasse. Essa atualização nos dá a liberdade de expressar o comportamento dos construtores.

Abaixo, vamos conferir como já estamos acostumados com versões anteriores, em que definimos um método estático privado convertRadianos para converter o ângulo de graus para radianos. Em seguida, chamamos esse método dentro do construtor da classe Ângulo, antes de invocar o super construtor para inicializar a superclasse Forma com o ângulo em radianos:

public class Angulo extends Forma {

public Angulo(double graus) {
super(converteRadianos(graus));
}

private static double converteRadianos(double graus) {
return Math.toRadians(graus);
}
}

Com o Java 22, é possível realizar a ação antes da chamada do super construtor, dentro do mesmo construtor e assim reduzir o código desnecessário. Veja abaixo:

public class Angulo extends Forma {

public Angulo(double graus) {
super(Math.toRadians(graus));
}

}

Implicitly Declared Classes and Instance Main Methods (2nd Preview) — JEP 463: essa feature ajuda, principalmente, desenvolvedores iniciantes que ainda estão conhecendo a linguagem. Se você já possui experiência com a linguagem, provavelmente solicitaria a criação de um HelloWorld em Java da forma abaixo:

public class HelloWorld {

public static void main(String[] args) {
System.out.println("Hello World");
}
}

Este exemplo, embora simples para quem está começando na linguagem, pode trazer dificuldades. Iniciantes ainda estão aprendendo conceitos como modificadores de visibilidade, estruturas de classes e métodos estáticos, além disso, o parâmetro “args” não utilizado e a longa instrução “System.out.println(…)” podem gerar confusão. Agora, conseguimos simplificar:

public class HelloWorld {

void main() {
System.out.println("Hello World");
}
}

Stream Gatherers (Preview) — JEP 461: auxilia desenvolvedores a aumentar a produtividade, aprimorando a API de fluxo para oferecer suporte a operações intermediárias personalizadas. Dessa forma, permite que pipelines de fluxo transformem os dados de modo que podem não ser facilmente obtidos com as operações intermediárias incorporadas existentes.

Achou pouco? Então confira abaixo uma lista completa com os demais recursos que estão em preview nessa nova versão:

String Templates (2nd Preview) — JEP 459: os String Templates chegam ao segundo preview para complementar as literais de string e blocos de texto existentes do Java, acoplando texto literal com expressões incorporadas e processadores de modelo para produzir resultados especializados.

Class-File API (Preview) — JEP 457: fornece uma API padrão para analisar, gerar e transformar arquivos de classe Java.

Stream Gatherers (Preview) — JEP 461: aprimora a Stream API para oferecer suporte a operações intermediárias personalizadas. Isso permite que pipelines de fluxo transformem dados de maneiras que não são facilmente alcançáveis ​​com as operações intermediárias integradas existentes.

Structured Concurrency (2nd Preview) — JEP 462: simplifica a programação simultânea. A simultaneidade estruturada trata grupos de tarefas relacionadas executadas em diferentes threads como uma única unidade de trabalho, o que simplifica o tratamento e cancelamento de erros e melhora a confiabilidade e observabilidade.

Scoped Values (2nd Preview) — JEP 464: essa feature mira a eficiência entre a troca de dados imutáveis entre threads.

Vector API (7th Incubator) — JEP 460: API feita para cálculos vetoriais, que são compilados de forma confiável em tempo de execução para instruções ideais em arquiteturas de CPU suportadas. Ela vai permitir que o Java alcance um desempenho superior aos cálculos escalares equivalentes, além de trazer uma capacidade de processamento nunca antes vista. Este JEP propõe reincubar a API no JDK 22, com pequenas melhorias na API em relação ao JDK 21. A implementação inclui correções de bugs e melhorias de desempenho.

Chegamos ao fim do artigo sobre as principais atualizações do Java 22. Ressalto que aqui o principal benefício dessa versão, já pontuado anteriormente: por ser uma versão de mais curta cadência, além de aproveitarmos as melhorias, já podemos começar a experimentar e entender quais features irão influenciar a linguagem no futuro.

Continue nos acompanhando por aqui para conferir novidades e comente sobre quais assuntos você gostaria de ler na nossa página!

--

--