Después de seis meses de desarrollo, la compañía Oracle lanzó la plataforma Java SE 20 (Java Platform, Standard Edition 20), cuya implementación de referencia utiliza el proyecto abierto OpenJDK. A excepción de la eliminación de algunas características obsoletas, Java SE 20 mantiene la compatibilidad hacia atrás con versiones anteriores de la plataforma Java: la mayoría de los proyectos Java escritos anteriormente funcionarán sin cambios al ejecutarse en la nueva versión. Las versiones listas para instalar de Java SE 20 (JDK, JRE y Server JRE) están preparadas para Linux (x86_64, AArch64), Windows (x86_64) y macOS (x86_64, AArch64). La implementación de referencia de Java 20 desarrollada en el marco del proyecto OpenJDK está completamente abierta bajo la licencia GPLv2 con excepciones de GNU ClassPath que permiten el enlace dinámico con productos comerciales.
Java SE 20 se clasifica como una versión con un ciclo de soporte normal, cuyas actualizaciones se emitirán hasta el próximo lanzamiento. Para una rama de soporte a largo plazo (LTS), se debe utilizar Java SE 17, cuyas actualizaciones se emitirán hasta 2029. Recordemos que, a partir de la versión Java 10, el proyecto pasó a un nuevo proceso de desarrollo que implica un ciclo de formación de nuevos lanzamientos más corto. La nueva funcionalidad ahora se desarrolla en una rama maestra continuamente actualizada, la cual incluye cambios ya listos y de la que se bifurcan ramas para la estabilización de nuevos lanzamientos cada seis meses.
Entre las novedades de Java 20 se destacan:
- Se ha propuesto un soporte preliminar para valores restringidos (Scoped Values), que permiten compartir datos inmutables entre hilos y comunicar datos de manera eficiente entre sub-hilos (los valores son heredados). Los Scoped Values se desarrollan para reemplazar el mecanismo de variables locales al hilo (thread-local variables) y son más eficientes en el uso de un número muy grande de hilos virtuales (miles y millones de hilos). La principal diferencia entre Scoped Values y las variables locales al hilo es que los primeros se escriben una vez, no pueden ser cambiados posteriormente y permanecen accesibles solo durante la ejecución del hilo. class Server { final static ScopedValue CURRENT_USER = new ScopedValue(); void serve(Request request, Response response) { var level = (request.isAuthorized() ? ADMIN : GUEST); var user = new User(level); ScopedValue.where(CURRENT_USER, user) .run(() -> Application.handle(request, response)); } } class DatabaseManager { DBConnection open() { var user = Server.CURRENT_USER.get(); if (!user.canOpen()) throw new InvalidUserException(); return new DBConnection(…); } }
- Se ha agregado una segunda implementación preliminar de patrones de registro (record pattern), que amplía la capacidad de coincidencia de patrones introducida en Java 16 para analizar valores de clases tipo record. Por ejemplo: record Point(int x, int y) {} static void printSum(Object obj) { if (obj instanceof Point p) { int x = p.x(); int y = p.y(); System.out.println(x + y); } }
- Se ha añadido la cuarta implementación preliminar de coincidencia por patrón en expresiones 'switch', permitiendo utilizar en las etiquetas 'case' no solo valores exactos, sino patrones flexibles que abarcan una serie de valores, para los cuales anteriormente se requerían voluminosas cadenas de expresiones 'if…else'. 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 -> o.toString(); }; }
- Se ha añadido una segunda implementación preliminar de la API FFM (Foreign Function & Memory), que permite organizar la interacción de programas Java con código y datos externos a través de llamadas a funciones de bibliotecas externas y acceso a memoria fuera de la JVM.
- Se ha añadido una segunda implementación preliminar de hilos virtuales, que son hilos ligeros que simplifican significativamente la escritura y el mantenimiento de aplicaciones de múltiples hilos de alto rendimiento.
- Se ha añadido una segunda versión de la API experimental para el paralelismo estructurado, que simplifica el desarrollo de aplicaciones multihilo al tratar múltiples tareas que se ejecutan en diferentes hilos como un único bloque.
- Se ha añadido la quinta implementación preliminar de la API Vector, que proporciona funciones para cálculos vectoriales que se realizan utilizando instrucciones vectoriales de los procesadores x86_64 y AArch64, permitiendo aplicar operaciones a varios valores simultáneamente (SIMD). A diferencia de las capacidades de autovectorización de operaciones escalares proporcionadas por el compilador JIT HotSpot, la nueva API permite un control explícito sobre la vectorización para el procesamiento paralelo de datos.
Fuente: opennet.ru
