Ayer Oracle liberó la versión 23 de la plataforma Java, tal y como estaba previsto. Dado que sacan una versión cada 6 meses, en muchas ocasiones no hay grandes cosas nuevas. Y en otras, como la que nos ocupa, sí que hay novedades interesantes pero todas todavía en alguna de las fases de versión preliminar, como vamos a ver. La última versión con características definitivas realmente relevantes fue la versión 21, hace justo un año.
En eso Java es una plataforma muy conservadora algo que es un arma de doble filo porque limita la potencia del lenguaje y la propia plataforma en el corto plazo, pero ayuda a que las empresas que dependen de ella puedan adaptarse poco a poco, o sea, proporciona estabilidad. Además, hace que las características tengan mucho feedback en un periodo de prueba y experimentación largo, lo que logra que no se dejen llevar solo por las modas del momento y que, cuando se lanzan definitivamente, estén muy trabajadas.
Esta versión 23 no es LTS, es decir, no tiene soporte a largo plazo. Para ello debemos esperar hasta la 25, dentro de un año. Y aún así pasarán probablemente años hasta que las empresas la adopten.
Vamos a dar un repaso rápido a todas las novedades de Java 23, con enlaces a las JEP correspondientes por si quieres profundizar...
Nota: todas las que están en preview 2 o posterior ya las hemos explicado con más detalle en posts anteriores, especialmente en el de Java 22.
La mayoría de estas características han salido del Proyecto Amber, que se centra en pequeñas pero importantes mejoras en el JDK para hacer el proceso de desarrollo más agradable. Incluye cambios como la inferencia de tipos de variables locales y otras mejoras del lenguaje que se han ido incorporando desde Java 10.
- Concurrencia Estructurada en Java (JEP 480, tercera preview): tiene como objetivo simplificar la programación concurrente mediante el tratamiento de las tareas relacionadas de varios subprocesos como una sola unidad de trabajo. Esto facilita el manejo de errores y la observabilidad, lo que reduce riesgos como fugas de datos en threads y disminuye retrasos en las cancelaciones.
- Valores con ámbito en Java (JEP 481, tercera preview): los Scoped Values, ya presentes como preview en versiones anteriores, facilitan el uso compartido de datos inmutables dentro de subprocesos y con subprocesos secundarios. Esta característica es especialmente beneficiosa cuando se usa con subprocesos virtuales y con simultaneidad estructurada, lo que reduce la sobrecarga asociada con los valores locales de los subprocesos. En este JDK 23, el método
ScopedValue.callWhere
se actualiza con una nueva interfaz funcional que simplifica el manejo de excepciones, mientras que el método ScopeValue.getWhere
se ha eliminado.
- Clases y métodos de instancia declarados implícitamente (JEP 477, tercera preview): para hacer que Java sea más accesible para los principiantes, esta característica permite declaraciones de clase más simples y una expansión más fácil de los programas. Algo parecido a lo que metió C# ya hace dos o tres versiones con el mismo objetivo e inspirado en Node.js y otros frameworks que estaban llevándose el gato al agua con los principiantes. El JDK 23 introduce mejoras adicionales, incluida la importación automática de tres métodos estáticos para E/S de texto y todas las clases e interfaces públicas de nivel superior de los paquetes exportados por el módulo
java.base
.
- Declaraciones de importación de módulos (JEP 476, preview). Permite importar módulos completos con una sola declaración, lo que simplifica el uso de bibliotecas modulares. Otra cuyo objetivo es hacer que Java sea más fácil de usar para los principiantes.
- Tipos primitivos en patterns, instanceof y switch (JEP 455, Preview). Esto elimina las restricciones en los tipos primitivos cuando se trabaja con coincidencia de patrones,
instanceof
y switch
, lo que permite que Java sea más expresivo y resulta una mejora de la productividad.
- Class-File API (JEP 466, segunda preview). Se trata de una nueva API para procesar archivos
.class
, alineada con la especificación de Java Virtual Machine. Esta API está destinada a sustituir a la biblioteca interna ASM de Java, proporcionando un enfoque más estándar para el procesamiento de esos archivos de clase generados por el compilador.
- Cuerpos de constructor flexibles (JEP 482, segunda versión preliminar): esta característica permite a los constructores inicializar campos antes de invocar a un constructor de la superclase. Este cambio da a los desarrolladores más libertad para estructurar la lógica del constructor, lo que simplifica el proceso de creación de clases y mantiene el orden de ejecución descendente de los constructores. Antes se le llamaba algo así como "declaraciones antes de
super(...)
".
- Comentarios de la documentación de Markdown (JEP 467). Esta sí es una característica final, o sea, ni beta ni preview, ni nada de eso. Nos da la capacidad de escribir comentarios de JavaDoc utilizando Markdown, lo que hace que la documentación final sea más legible y más fácil de escribir 🎉. Se trata de intentar acelerar el proceso de creación y mantenimiento de la documentación de las API.
-
Stream Gatherers (JEP 473, segunda preview). Los "recopiladores de flujos", presentados en JDK 22 (ya te hemos hablado de ellos antes), mejoran la API de streams para admitir operaciones intermedias personalizadas. Permiten que los pipes (canalizaciones) de los streams transformen los datos de formas que no se pueden lograr con facilidad con las operaciones intermedias que existen ahora. Al hacer que las canalizaciones de flujo sean más flexibles y expresivas y permitir que las operaciones intermedias personalizadas manipulen flujos de tamaño infinito, esta característica permite a los desarrolladores ser más eficientes en la lectura, escritura y mantenimiento del código Java.
- Z Garbage Collector (ZGC) en modo generacional por defecto (JEP 474). Otra cosa definitiva. El modo predeterminado para el recolector de basura Z será generacional, centrándose en la recolección más frecuente de objetos jóvenes para aumentar el rendimiento de la aplicación. El modo no generacional quedará marcado como obsoleto, apostando por un enfoque más moderno en la recolección basura del framework.
- Vector API (JEP 469,octava Incubación). Esta API permite a los desarrolladores mejorar el rendimiento más allá de los cálculos escalares estándar al facilitar una forma de expresar operaciones vectoriales. Estas operaciones se compilan de manera eficiente en tiempo de ejecución para aprovechar las instrucciones vectorizadas en arquitecturas de CPU que las soportan.
Se han declarado como obsoletos los métodos de acceso a la memoria en el paquete sun.misc.Unsafe
: Se eliminarán eliminación en una futura versión así que si tienes código que los utilice, vete migrando ya. La recomendación es utilizar la API VarHandle
o a la API de memoria y funciones foráneas, que funcionarán sin problema en futuras versiones de Java.
Ah, y una cosa que han eliminado, y que es una verdadera pena, son las plantillas de cadena (te hablamos de ellas en Java 21 el año pasado), de las que gozan hace mucho tiempo lenguajes como C# o incluso JavaScript. Esta característica mejoraría sustancialmente el manejo de cadenas en Java, pero de momento parece que se ha pospuesto para un posible rediseño 😡
Puedes descargar Java 23 desde la página de Open JDK.