Dentro de la (en mi opinión bastante absurda) metodología de lanzamiento de versiones "mayores" de la plataforma Java cada 6 meses, el pasado martes ha aparecido la versión 12 de Java.
Esta versión llega tan solo 6 meses después de la versión 11, y no se considera una versión con soporte a largo plazo (LTS) por lo que solo se le dará soporte durante 6 meses por parte de Oracle.
Entre las cuestiones destacables de esta versión solamente hay dos, y encima se consideran experimentales.
Veámoslas rápidamente:
Switch expressions
Las "Expresiones de conmutación" o Switch Expressions, son una nueva función de lenguaje que se basa en la instrucción switch
existente en el lenguaje desde siempre. Esta nueva variante nos permite crear una manera más concisa de expresar lo mismo que un condicional que tiene varias ramas. Su aspecto este:
int numDias = switch(mes) {
case 1, 3, 5, 7, 8, 10, 12 -> 31;
case 4, 6, 9, 11 -> 30;
case 2 -> esBisiesto(anio) ? 29 : 28;
default: throw new IllegalArgumentException("Número de mes no válido");
}
En este caso asignamos en una variable el número de días del mes del año que nos interese usando esta nueva sintaxis. Fíjate en que se utiliza un operador flecha (->
) en lugar de los típicos dos puntos (:
), y que no hace falta meter instrucciones break
en cada uno de los casos, por lo que la sintaxis es muy compacta. Fíjate también en cómo se puede utilizar cualquier tipo de instrucción en cada rama (como en el caso de los años bisiestos para febrero), y cómo todos los posibles valores que se le pasen al switch
deben tener una rama que los gestione, incluso si generan un error, como es el caso final en el que no se pasa un mes válido.
La única opción de no tener que poner una rama default
es si usamos una enumeración como argumento para el switch
. Si metemos todos los posibles valores de la enumeración dentro de las ramas, podemos omitir default
, lógicamente.
Es importante señalar que, si bien esto se ha incluido en Java 12, se considera todavía una característica experimental, por lo que no te funcionará por defecto. Para que te funcione y poder usarla en tus programas debes utilizar el modificador --enable-preview
con javac
, el compilador de Java. Así que tenlo en cuenta.
Shenandoah, un nuevo recolector de basura
La principal novedad de Java 12 es su nuevo sistema de recolección de basura, que se llama Shenandoah. Su principal ventaja frente al GC existente es que reduce los tiempos de pausa de las aplicaciones mientras se realiza la limpieza de memoria (evacuación, marcado, compactación...) ya que realiza más trabajo de este tipo en paralelo a la ejecución del propio programa, lo que implica también que las pausas de los programas para limpieza ya no estarán directamente relacionadas con el tamaño de la pila. Todavía quedan trabajos de limpieza que se deben hacer por separado, pero son mucho menores y por lo tanto las pausas son muy pequeñas.
Shenandoah se considera también una tecnología experimental en Java 12, por lo que para que tu programa la utilice deberás habilitarla explícitamente usando las opciones -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC
al ejecutar el comando java.
En la página oficial del OpenJDK para este nuevo recolector de basura puedes encontrar todos los detalles de funcionamiento y una lista con los modificadores de su comportamiento.
Además de Shenandoah, el recolector de basura convencional, G1, tiene algunas mejoras, en concreto ahora si detecta que falla varias veces seguidas a la hora de determinar el tiempo máximo de pausa necesario para la limpieza, y ajusta la heurística para mejorar la predicción y detener el proceso si es necesario. También mejora el uso de memoria devolviendo al sistema operativo durante los periodos de inactividad la memoria de pila que está sin usar. Esto último es una gran mejora puesto que hasta ahora no devolvía al sistema la memoria de pila sin usar a no ser que se realizase una "limpieza de basura" completa (y por tanto costosa).
Otras cosillas
Aparte de lo anterior, esta versión tiene otras 4 pequeñas mejoras que enlazo a continuación con su nombre oficial, por si tienes interés:
Ya están disponibles las versiones de Java 12 para el OpenJDK y para el build oficial de Oracle.