Lanzamento da plataforma Java SE 22 e implementación de referencia aberta OpenJDK 22

Despois de seis meses de desenvolvemento, Oracle lanzou a plataforma Java SE 22 (Java Platform, Standard Edition 22), que utiliza o proxecto de código aberto OpenJDK como implementación de referencia. Coa excepción da eliminación dalgunhas funcións obsoletas, Java SE 22 mantén a compatibilidade con versións anteriores da plataforma Java; a maioría dos proxectos Java escritos anteriormente aínda funcionarán sen modificación cando se executen coa nova versión. As compilacións instalables de Java SE 22 (JDK, JRE e Server JRE) están preparadas para Linux (x86_64, AArch64), Windows (x86_64) e macOS (x86_64, AArch64). Desenvolvida polo proxecto OpenJDK, a implementación de referencia de Java 22 é totalmente de código aberto baixo a licenza GPLv2 con excepcións GNU ClassPath para permitir ligazóns dinámicas a produtos comerciais.

Java SE 22 está clasificado como unha versión de soporte regular e continuará recibindo actualizacións ata a próxima versión. A rama de Soporte a longo prazo (LTS) debería ser Java SE 21 ou Java SE 17, que recibirán actualizacións ata 2031 e 2029, respectivamente (dispoñible en xeral ata 2028 e 2026). O soporte público para a rama LTS de Java SE 11 rematou o pasado setembro, pero o soporte estendido continuará ata 2032. O soporte estendido para a rama LTS de Java SE 8 continuará ata 2030.

Lembrámosvos que a partir do lanzamento de Java 10, o proxecto pasou a un novo proceso de desenvolvemento, o que implica un ciclo máis curto para a formación de novos lanzamentos. Agora desenvólvese unha nova funcionalidade nunha rama mestra que se actualiza constantemente, que inclúe cambios xa feitos e desde a que se ramifican cada seis meses para estabilizar as novas versións.

As novas funcións de Java 22 inclúen:

  • O colector de lixo G1 inclúe soporte para fixar rexións, o que lle permite corrixir temporalmente a localización dos obxectos Java na memoria para evitar que sexan movidos polo colector de lixo e permitir que as referencias a estes obxectos se pasen de forma segura entre Java e o código nativo. A fixación permítelle reducir a latencia e evitar desactivar a recollida de lixo ao executar rexións críticas de JNI (Java Native Interface) con código nativo (mentres executa estas seccións, a JVM non debería mover obxectos críticos asociados a elas para evitar condicións de carreira). A fixación elimina os obxectos críticos da vista do colector de lixo, que pode seguir limpando áreas sen fixar.
  • Engadiuse unha característica preliminar para permitir que se especifiquen expresións nos construtores antes de chamar a super(...), que se usa para chamar explícitamente a un construtor de clase pai desde un construtor de clases herdado se esas expresións non fan referencia a unha instancia creada polo construtor. class Outer { void ola () { System.out.println ("Ola"); } class Inner { Inner () { ola (); super(); } } }
  • Estabilizouse a API FFM (Foreign Function & Memory), permitindo a interacción de programas Java con código e datos externos chamando a funcións desde bibliotecas externas e accedendo a memoria fóra da JVM, sen recorrer ao uso de JNI (Java Native Interface).
  • Activouse o soporte para as variables sen nome e a coincidencia de patróns; en lugar de variables e patróns non utilizados pero necesarios ao chamar, agora podes especificar o carácter "_". // was String pageName = switch (page) { case GitHubIssuePage(var url, var content, var links, int issueNumber) -> “ISSUE #” + issueNumber; ...}; // agora pode String pageName = cambiar (páxina) { case GitHubIssuePage(_, _, _, int issueNumber) -> “ISSUE #” + issueNumber; };
  • Proponse unha implementación preliminar da API Class-File para analizar, xerar e converter ficheiros de clases Java. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instancia de MethodModel mm && mm.methodName().stringValue(). startsWith("depurar"))) { classBuilder.with(ce);
  • A utilidade java ofrece a posibilidade de executar programas Java, ofrecidos en forma de varios ficheiros de código ou bibliotecas de clases precompiladas, sen compilar estes ficheiros por separado e sen configurar o sistema de compilación. A nova función facilita a execución de programas nos que o código de diferentes clases está separado en ficheiros separados. Prog.java: class Prog { public static void main(String[] args) { Helper.run(); } } Helper.java: class Helper { static void run() { System.out.println("Ola!"); } }

    Por exemplo, para executar un programa composto por dous ficheiros "Prog.java" e "Helper.java" agora é suficiente con executar "java Prog.java", que compilará a clase Prog, definirá unha referencia á clase Helper, buscar e compilar o ficheiro de axuda java e chamar ao método principal.

  • Engadida unha segunda implementación preliminar de modelos de cadea, implementada ademais de literales de cadea e bloques de texto. Os modelos de cadea permítenche combinar texto con expresións calculadas e variables sen utilizar o operador +. A substitución de expresións realízase mediante substitucións \{..} e pódense conectar controladores especiais para comprobar a corrección dos valores substituídos. Por exemplo, o motor SQL comproba os valores que se están substituíndo no código SQL e devolve un obxecto java.sql.Statement como saída, mentres que o procesador JSON supervisa a corrección das substitucións JSON e devolve un JsonNode. Consulta de cadea = "SELECT * FROM Persoa p WHERE p." + propiedade + " = '" + valor + "'"; // was Statement query = SQL."""SELECT * FROM Person p WHERE p.\{property} = '\{value}'"""; // converteuse
  • Engadiuse unha sétima vista previa da API Vector, que ofrece funcións para cálculos vectoriais que se realizan mediante instrucións vectoriais nos procesadores x86_64 e AArch64 e permiten aplicar operacións simultáneamente a varios valores (SIMD). A diferenza das capacidades proporcionadas no compilador HotSpot JIT para a vectorización automática de operacións escalares, a nova API permite controlar explícitamente a vectorización para o procesamento de datos paralelo.
  • Engadiuse unha implementación preliminar da API de Stream estendida que permite definir as túas propias operacións intermedias, o que pode ser útil nos casos en que as operacións intermedias integradas existentes non sexan suficientes para a transformación de datos desexada. Os controladores nativos conéctanse mediante a nova operación intermedia Stream::gather(Gatherer), que procesa os elementos do fluxo aplicándolles un controlador especificado polo usuario. 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]]
  • Propúxose para probar unha segunda versión da API experimental para a simultaneidade estruturada, que simplifica o desenvolvemento de aplicacións multiproceso procesando varias tarefas executadas en diferentes fíos como un único bloque.
  • Engadida unha segunda implementación preliminar de clases declaradas implicitamente e instancias sen nome do método "principal", que pode prescindir de declaracións públicas/estáticas, pasar unha matriz de argumentos e outras entidades asociadas cunha declaración de clase. // era public class HelloWorld { public static void main(String[] args) { System.out.println("Ola mundo!"); } } // agora podes void main() { System.out.println("Ola, mundo!"); }
  • Engadiuse unha segunda implementación de vista previa de Valores de alcance, que permite compartir datos inmutables entre fíos e intercambiar datos de forma eficiente entre fíos secundarios (os valores herdanse). Os valores de alcance están a ser desenvolvidos para substituír o mecanismo de variables locais de fíos e son máis eficientes cando se usan un gran número de fíos virtuais (miles ou millóns de fíos). A principal diferenza entre os valores de alcance e as variables locais do fío é que as primeiras se escriben unha vez, non se poden cambiar no futuro e permanecen dispoñibles só durante a execución do fío.
  • O colector de lixo paralelo mellorou o rendemento cando se traballa con grandes conxuntos de obxectos. A optimización fixo posible nalgunhas probas con grandes matrices de obxectos reducir o atraso antes de comezar a buscar un obxecto nun 20%.

Ademais, pódese observar a publicación dunha actualización da plataforma para a creación de aplicacións cunha interface gráfica JavaFX 22.

Fonte: opennet.ru

Engadir un comentario