Lançamento da plataforma Java SE 22 e implementação de referência aberta OpenJDK 22

Após seis meses de desenvolvimento, a Oracle lançou o Java SE 22 (Java Platform, Standard Edition 22), que usa o projeto OpenJDK de código aberto como implementação de referência. Com exceção da remoção de alguns recursos obsoletos, o Java SE 22 mantém compatibilidade retroativa com versões anteriores da plataforma Java - a maioria dos projetos Java escritos anteriormente funcionarão sem alterações quando executados na nova versão. Compilações prontas para instalação do Java SE 22 (JDK, JRE e Server JRE) são preparadas para Linux (x86_64, AArch64), Windows (x86_64) e macOS (x86_64, AArch64). Desenvolvida pelo projeto OpenJDK, a implementação de referência Java 22 é totalmente open source sob a licença GPLv2, com exceções GNU ClassPath permitindo vinculação dinâmica com produtos comerciais.

Java SE 22 é classificado como uma versão de suporte regular e continuará recebendo atualizações até a próxima versão. O branch Long Term Support (LTS) deverá ser Java SE 21 ou Java SE 17, que receberá atualizações até 2031 e 2029, respectivamente (disponível geralmente até 2028 e 2026). O suporte público para o ramo LTS do Java SE 11 terminou em setembro passado, mas o suporte estendido continuará até 2032. O suporte estendido para a ramificação LTS do Java SE 8 continuará até 2030.

Lembramos que a partir do lançamento do Java 10, o projeto passou para um novo processo de desenvolvimento, implicando em um ciclo mais curto para a formação de novos lançamentos. A nova funcionalidade agora é desenvolvida em um branch master constantemente atualizado, que inclui alterações prontas e a partir do qual os branchs são ramificados a cada seis meses para estabilizar novos lançamentos.

Os novos recursos do Java 22 incluem:

  • O coletor de lixo G1 inclui suporte para fixação de região, que permite corrigir temporariamente a localização de objetos Java na memória para evitar que sejam movidos pelo coletor de lixo e permitir que referências a esses objetos sejam passadas com segurança entre Java e o código nativo. A fixação permite reduzir a latência e evitar a desativação da coleta de lixo ao executar regiões críticas de JNI (Java Native Interface) com código nativo (ao executar essas seções, a JVM não deve mover objetos críticos associados a elas para evitar condições de corrida). A fixação remove objetos críticos da visualização do coletor de lixo, que pode continuar a limpar áreas não fixadas.
  • Um recurso preliminar foi adicionado para permitir que expressões sejam especificadas em construtores antes de chamar super(...), usado para chamar explicitamente um construtor de classe pai de um construtor de classe herdado se essas expressões não se referirem a uma instância criada pelo construtor. class Outer { void olá() { System.out.println("Olá"); } class Interior { Interior() { olá(); super(); } } }
  • A API FFM (Foreign Function & Memory) foi estabilizada, permitindo a interação de programas Java com códigos e dados externos, chamando funções de bibliotecas externas e acessando memória fora da JVM, sem recorrer ao uso de JNI (Java Native Interface).
  • O suporte para variáveis ​​sem nome e correspondência de padrões foi habilitado - em vez de variáveis ​​e padrões não utilizados, mas necessários ao chamar, agora você pode especificar o caractere “_”. // was String pageName = switch (página) { case GitHubIssuePage(var url, var content, var links, int issueNumber) -> “ISSUE #” + issueNumber; ... }; // agora você pode String pageName = switch (page) { case GitHubIssuePage(_, _, _, int issueNumber) -> “ISSUE #” + issueNumber; };
  • Uma implementação preliminar da API Class-File é proposta para analisar, gerar e converter arquivos de classe Java. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm && mm.methodName().stringValue(). começaCom("depurar"))) { classBuilder.with(ce);
  • O utilitário Java fornece a capacidade de executar programas Java, fornecidos na forma de vários arquivos de código ou bibliotecas de classes pré-compiladas, sem compilar separadamente esses arquivos e sem configurar o sistema de compilação. O novo recurso facilita a execução de programas nos quais o código de diferentes classes é separado em arquivos separados. Prog.java: class Prog { public static void main(String[] args) { Helper.run(); } } Helper.java: class Helper { static void run() { System.out.println("Olá!"); } }

    Por exemplo, para executar um programa composto por dois arquivos "Prog.java" e "Helper.java" agora é suficiente executar "java Prog.java", que irá compilar a classe Prog, definir uma referência para a classe Helper, encontre e compile o arquivo Helper java e chame o método principal.

  • Adicionada uma segunda implementação preliminar de String Templates, implementada além de literais de string e blocos de texto. Os modelos de string permitem combinar texto com expressões e variáveis ​​calculadas sem usar o operador +. A substituição de expressões é realizada usando substituições \{..}, e manipuladores especiais podem ser conectados para verificar a exatidão dos valores substituídos. Por exemplo, o mecanismo SQL verifica os valores que estão sendo substituídos no código SQL e retorna um objeto java.sql.Statement como saída, enquanto o processador JSON monitora a exatidão das substituições JSON e retorna um JsonNode. Consulta de string = "SELECT * FROM Pessoa p WHERE p." + propriedade + " = '" + valor + "'"; // foi Instrução consulta = SQL."""SELECT * FROM Person p WHERE p.\{property} = '\{value}'"""; // tornou-se
  • Uma sétima visualização da API Vector foi adicionada, fornecendo funções para cálculos vetoriais que são executados usando instruções vetoriais em processadores x86_64 e AArch64 e permitem que operações sejam aplicadas simultaneamente a vários valores (SIMD). Ao contrário dos recursos fornecidos no compilador HotSpot JIT para autovetorização de operações escalares, a nova API torna possível controlar explicitamente a vetorização para processamento paralelo de dados.
  • Foi adicionada uma implementação preliminar da API Stream estendida que suporta a definição de suas próprias operações intermediárias, o que pode ser útil em casos em que as operações intermediárias integradas existentes não são suficientes para a transformação de dados desejada. Os manipuladores nativos são conectados usando a nova operação intermediária Stream::gather(Gatherer), que processa elementos de fluxo aplicando a eles um manipulador especificado pelo usuário. jshell> Stream.of(1,2,3,4,5,6,7,8,9).gather(new WindowFixed(3)).toList() $1 ==> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
  • Uma segunda versão da API experimental para Simultaneidade Estruturada foi proposta para teste, o que simplifica o desenvolvimento de aplicações multithread ao processar múltiplas tarefas executadas em threads diferentes como um único bloco.
  • Adicionada uma segunda implementação preliminar de classes declaradas implicitamente e instâncias sem nome do método "principal", que pode dispensar declarações públicas/estáticas, passar uma matriz de argumentos e outras entidades associadas a uma declaração de classe. // era public class HelloWorld { public static void main(String[] args) { System.out.println("Olá mundo!"); } } // agora você pode void main() { System.out.println("Hello, World!"); }
  • Adicionada uma segunda implementação de visualização de valores com escopo, permitindo que dados imutáveis ​​sejam compartilhados entre threads e dados trocados de forma eficiente entre threads filhos (os valores são herdados). Os valores com escopo estão sendo desenvolvidos para substituir o mecanismo de variáveis ​​​​locais de thread e são mais eficientes ao usar um número muito grande de threads virtuais (milhares ou milhões de threads). A principal diferença entre valores com escopo e variáveis ​​locais de thread é que os primeiros são gravados uma vez, não podem ser alterados no futuro e permanecem disponíveis apenas durante a execução do thread.
  • O coletor de lixo Parallel melhorou o desempenho ao trabalhar com grandes matrizes de objetos. A otimização possibilitou, em alguns testes com grandes matrizes de objetos, reduzir em 20% o atraso antes de iniciar a busca por um objeto.

Além disso, é possível observar a publicação de uma atualização da plataforma de criação de aplicações com interface gráfica JavaFX 22.

Fonte: opennet.ru

Adicionar um comentário