O Java Development Kit 22, previsto para março de 2024 como a próxima versão do Java Standard Edition, incluirá 12 recursos, com uma segunda visualização dos valores com escopo definido e uma visualização dos coletores de fluxo sendo as últimas adições.

O JDK 22 atingiu a fase de desaceleração uma, com o conjunto de recursos congelado, em 7 de dezembro de 2023, e entrou na fase de desaceleração dois em 18 de janeiro de 2024. A disponibilidade geral está definida para 19 de março, com dois candidatos a lançamento planejados para fevereiro. Bugs serão examinados até o lançamento geral.

Os valores com escopo permitem o compartilhamento seguro e eficiente de dados imutáveis ​​dentro e entre threads. Elas são preferidas às variáveis ​​locais de thread, especialmente ao usar um grande número de variáveis ​​de thread. As metas incluem facilidade de uso, compreensibilidade, robustez e desempenho.

Os coletores de fluxo aprimorarão a API de fluxo para oferecer suporte a operações intermediárias personalizadas. Isso permitirá que os pipelines de fluxo transformem dados de maneiras que não seriam facilmente alcançáveis ​​com as operações intermediárias integradas existentes.

Esses recursos mais recentes se juntam a uma segunda prévia da simultaneidade estruturada, uma prévia das declarações antes super(…), uma visualização de uma API de arquivo de classe, fixação de região para o coletor de lixo G1, uma segunda visualização de modelos de string, variáveis ​​e padrões sem nome, uma função externa e API de memória e uma sétima incubadora de uma API de vetor. Uma segunda visualização de classes declaradas implicitamente e métodos principais de instância, e um aprimoramento para o iniciador Java que permitiria executar programas com vários arquivos, também foram propostos.

Compilações de acesso antecipado do JDK 22 estão disponíveis em jdk.java.net para Linux, Windows e Mac.

Com a simultaneidade estruturada, a programação simultânea é simplificada por meio de uma API que trata grupos de tarefas relacionadas executadas em diferentes threads como uma única unidade de trabalho, simplificando assim o tratamento e cancelamento de erros, melhorando a confiabilidade e aprimorando a observabilidade. Esta API foi visualizada no JDK 21 e incubada no JDK 19 e JDK 20.

O aprimoramento do inicializador de aplicativos Java permitirá executar um programa fornecido como vários arquivos de código-fonte Java. O objetivo por trás da capacidade de lançar programas de código-fonte com vários arquivos é tornar a transição de programas pequenos para programas maiores mais gradual, permitindo que os desenvolvedores escolham se e quando terão o trabalho de configurar uma ferramenta de construção.

A API de arquivo de classe fornecerá uma API padrão para analisar, gerar e transformar arquivos de classe Java. O objetivo é permitir que os componentes do JDK migrem para a API padrão e, eventualmente, removam a cópia interna do JDK da biblioteca ASM de terceiros. Analisar, gerar e transformar arquivos de classe é onipresente, usado por ferramentas e bibliotecas independentes para examinar e estender programas sem comprometer a capacidade de manutenção do código-fonte.

No entanto, o formato de arquivo de classe Java evolui mais rapidamente agora do que anteriormente, devido à cadência de lançamento padrão de seis meses do Java. Essa velocidade de evolução resultou em estruturas encontrando com mais frequência arquivos de classe mais recentes que a biblioteca de arquivos de classe. Isso resultou em erros e em desenvolvedores de estruturas tentando escrever código para analisar arquivos de classe do futuro e esperando que nada muito sério mude. O plano é fazer com que a plataforma Java defina e implemente uma API de arquivo de classe padrão para evoluir junto com o formato do arquivo de classe.

A fixação de região para G1 tem como objetivo reduzir a latência, para que a coleta de lixo (GC) não precise ser desativada durante regiões críticas da Java Native Interface (JNI). As metas incluem a ausência de paralisação de threads devido a regiões JNI críticas, nenhuma latência adicional para iniciar a coleta de lixo devido a essas regiões, nenhuma regressão nos tempos de pausa do GC quando nenhuma dessas regiões estiver ativa e regressões mínimas nos tempos de pausa do GC quando essas regiões estiverem ativas. . Atualmente, o GC padrão, G1, desativa a coleta de lixo durante todas as regiões críticas, o que pode ter um impacto significativo na latência. Com essa mudança, os threads Java nunca esperarão pela conclusão de uma operação de GC G1.

Classes e métodos de instância declarados implicitamente estão sendo visualizados no JDK 21 como classes e métodos de instância sem nome. Este recurso receberia o título revisado e mudanças significativas no JDK 22 em uma segunda prévia. O objetivo do recurso é evoluir a linguagem Java para que os alunos possam escrever seus primeiros programas sem a necessidade de compreender os recursos da linguagem projetados para programas grandes. Os alunos poderiam escrever declarações simplificadas para programas de classe única e, em seguida, expandir os programas para usar recursos mais avançados à medida que suas habilidades aumentassem. A segunda prévia faz alterações na declaração de classe e na invocação de método que simplificam a proposta original.

A visualização das declarações antes super(…) refere-se a construtores na linguagem, permitindo que instruções que não fazem referência à instância que está sendo criada apareçam antes de um construtor explícito. Um objetivo do plano inclui dar aos desenvolvedores maior liberdade para expressar o comportamento dos construtores, permitindo um posicionamento mais natural da lógica que atualmente deve ser fatorada em métodos estáticos auxiliares, construtores intermediários auxiliares ou argumentos de construtores.

Outro objetivo é preservar a garantia existente de que os construtores sejam executados de cima para baixo durante a instanciação da classe, garantindo que o código em um construtor de subclasse não possa interferir na instanciação da superclasse. Um terceiro objetivo declarado é não exigir quaisquer alterações na JVM. Este é o único recurso do JDK 22, até agora, que ainda não foi previamente visualizado ou incubado no Java padrão.

Os modelos de string complementarão os 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. As metas incluem:

  • Simplificar a escrita de programas Java, facilitando a expressão de strings que incluem valores calculados em tempo de execução.
  • Melhorar a legibilidade de expressões que misturam texto e expressões, quer o texto caiba em uma única linha de origem ou abranja várias linhas de origem.
  • Melhorar a segurança de programas que compõem strings a partir de valores fornecidos pelo usuário e os transmitem para outros sistemas, apoiando a validação e a transformação do modelo e dos valores de suas expressões incorporadas.
  • Manter a flexibilidade permitindo que as bibliotecas Java definam a sintaxe de formatação usada em modelos de string.
  • Simplificando o uso de APIs que aceitam strings escritas em linguagens não Java, como XML e JSON.
  • Permitir a criação de valores não-string calculados a partir de texto literal e expressões incorporadas sem a necessidade de transitar por uma representação de string intermediária.

Os modelos de string aparecem em uma primeira visualização no JDK 21. A segunda visualização tem como objetivo obter experiência e feedback adicionais. Exceto por uma alteração técnica nos tipos de expressões do modelo, não há alterações em relação à primeira visualização.

Uma API vetorial (sétima incubadora) expressaria cálculos vetoriais que seriam compilados de forma confiável em tempo de execução para instruções vetoriais ideais em arquiteturas de CPU suportadas, alcançando desempenho superior a cálculos escalares equivalentes. A API fornece uma maneira de escrever algoritmos vetoriais complexos em Java, usando o algoritmo de autovetorização HotSpot existente, mas com um modelo de usuário que torna a vetorização mais previsível e robusta.

Esse recurso foi incubado em versões anteriores do Java desde o JDK 16 em março de 2021. Os objetivos da API incluem ser claro e conciso, independente de plataforma e oferecer compilação e desempenho confiáveis ​​​​em tempo de execução em arquiteturas x64 AArch64, bem como degradação elegante . Esse recurso tem como objetivo aproveitar os aprimoramentos do Project Valhalla no modelo de objeto Java, permitindo que os programas trabalhem com objetos de valor.

Variáveis ​​e padrões sem nome podem ser usados ​​quando declarações de variáveis ​​ou padrões aninhados são necessários, mas nunca usados. Os objetivos do plano incluem:

  • Capturar a intenção do desenvolvedor de que uma determinada ligação ou parâmetro lambda não seja utilizado e aplicar essa propriedade para esclarecer programas e reduzir oportunidades de erro
  • Melhorando a manutenção do código identificando variáveis ​​que devem ser declaradas, mas não são usadas
  • Permitir que vários padrões apareçam em um único rótulo de caso, desde que nenhum deles declare variáveis ​​de padrão
  • Melhorando a legibilidade dos padrões de registro, eliminando padrões de tipo aninhados desnecessários

Esta proposta foi visualizada no JDK 21 e será finalizada sem alterações no JDK 22.

A função externa e a API de memória permitem que programas Java interoperem com código e dados fora do tempo de execução Java. Ao invocar funções estrangeiras e acessar com segurança a memória externa, os programas Java podem chamar bibliotecas nativas e processar dados nativos sem a fragilidade da JNI (Java Native Interface), afirma a proposta.

A função externa e a API de memória foram previamente visualizadas no JDK 19, JDK 20 e JDK 21. Ela seria finalizada no JDK 22. As revisões mais recentes cobrem três áreas: suporte a conjuntos de caracteres arbitrários para strings nativas, permitindo que os clientes construam funções em linguagem C descritores programaticamente e introduzindo o atributo de manifesto do arquivo JAR Enable-Native-Access. Este último permite que arquivos JAR executáveis ​​chamem métodos restritos sem a necessidade de usar a opção de linha de comando —enable-native-access.

Java 22 é uma versão de recurso que receberá seis meses de suporte da Oracle, ao contrário do recém-lançado JDK 21, que é uma versão de suporte de longo prazo (LTS) que receberá pelo menos oito anos de suporte. Empresas além da Oracle poderiam oferecer suporte mais longo para JDK 22, se assim o desejarem. As atualizações padrão do Java ocorrem a cada seis meses e as versões LTS chegam a cada dois anos.