Java 12 lanzado: versión descafeinada sin  soporte a largo plazo
Tags: java, spanish
Published: 2019-04-02 15:07:57

---
title: Java 12 lanzado: versión descafeinada sin  soporte a largo plazo
published: true
tags: Java, Spanish
canonical_url: https://www.campusmvp.es/recursos/post/java-12-lanzado-version-descafeinada-sin-soporte-a-largo-plazo.aspx
cover_image: https://www.campusmvp.es/recursos/image.axd?picture=/2019/1T/java12.jpg
---

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 día 19 de marzo apareció la **versión 12 de Java**.

Esta versión llega tan solo 6 meses después de [la versión 11](https://www.campusmvp.es/recursos/post/java-11-ya-esta-aqui-te-toca-pagar-a-oracle-o-cambiarte-a-otras-opciones.aspx), 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

![Imagen ornamental](https://www.campusmvp.es/recursos/image.axd?picture=/2019/1T/java12.jpg)

La principal novedad de Java 12 es su nuevo sistema de [recolección de basura](https://www.campusmvp.es/recursos/post/Modelos-de-gestion-de-memoria-II-Garbage-collector.aspx), 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](https://wiki.openjdk.java.net/display/shenandoah/Main) 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](https://openjdk.java.net/jeps/344) 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](https://openjdk.java.net/jeps/346). 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:

- [JEP 230 – Microbenchmark Suite](http://openjdk.java.net/jeps/230)
- [JEP 334 – JVM Constants API](http://openjdk.java.net/jeps/334)
- [JEP 340 – Un único AArch64 Port, Not Two](http://openjdk.java.net/jeps/340)
- [JEP 341 – Default CDS Archives](http://openjdk.java.net/jeps/341)

Ya están disponibles las versiones de [**Java 12 para el OpenJDK**](https://jdk.java.net/12/) y para **[el build oficial de Oracle](https://www.oracle.com/technetwork/java/javase/downloads/index.html)**.

> **Post original**: https://www.campusmvp.es/recursos/post/java-12-lanzado-version-descafeinada-sin-soporte-a-largo-plazo.aspx