Novedades por versión

Java 21

Hilos virtuales, patrones en switch y record patterns.

Desde Java 21

Qué fue

Java 21 llegó el 19 de septiembre de 2023 (JSR 396) y es la LTS que cambió el modelo de concurrencia sin obligarte a reescribir nada. También es la versión en la que el switch con patrones deja de ser una vista previa.

Hilos virtuales

Un hilo de plataforma es un hilo del sistema operativo. Son caros: miles cuestan memoria y miles de cambios de contexto cuestan tiempo. Un hilo virtual lo gestiona la máquina virtual y solo ocupa un hilo del sistema mientras de verdad ejecuta. Se pueden tener cientos de miles.

java
try (var ejecutor = Executors.newVirtualThreadPerTaskExecutor()) {
    for (var tarea : tareas) {
        ejecutor.submit(tarea);
    }
}

La consecuencia es de diseño, no de rendimiento: el código bloqueante vuelve a escalar. Puedes escribir una petición por hilo, con su try, su catch y su sleep, y atender diez mil conexiones. No hace falta reescribir nada en estilo reactivo.

Patrones en switch y record patterns

La JEP 441 cierra el switch con patrones y la JEP 440 añade la deconstrucción de registros:

java
sealed interface Forma permits Circulo, Rectangulo {}
record Circulo(double radio) implements Forma {}
record Rectangulo(double ancho, double alto) implements Forma {}

double area(Forma forma) {
    return switch (forma) {
        case Circulo(double radio) -> Math.PI * radio * radio;
        case Rectangulo(double ancho, double alto) -> ancho * alto;
    };
}

Sin patrón harías instanceof, un cast y una cadena de if. Además el switch es una expresión exhaustiva: si añades una forma al sealed, el build falla hasta que la atiendas.

Colecciones secuenciadas

La JEP 431 unifica el acceso por los extremos, que hasta ahora cada tipo resolvía a su manera: list.get(0), deque.getFirst(), map sin orden. Ahora List, Deque y LinkedHashSet comparten getFirst, getLast, addFirst, addLast y reversed().

java
List<String> pasos = new ArrayList<>(List.of("instalar", "configurar", "probar"));
System.out.println(pasos.getFirst());   // instalar
System.out.println(pasos.getLast());    // probar
System.out.println(pasos.reversed());   // vista invertida, no una copia

ZGC generacional, con bandera

La JEP 439 añade una ZGC por generaciones: los objetos jóvenes se recogen más a menudo y más barato. Ojo con el detalle: en 21 hay que pedirla explícitamente.

bash
java -XX:+UseZGC -XX:+ZGenerational Aplicacion

El aviso de los agentes

La JEP 451 hace que la máquina virtual avise cuando un agente se carga de forma dinámica. No rompe nada, pero ensucia la salida de error de herramientas que lo hacían en silencio, y es el primer paso hacia un JDK que no permite modificar su propio código en caliente.

Todavía en preview

  • JEP 430: plantillas de cadena.
  • JEP 443: patrones y variables sin nombre (_).
  • JEP 445: clases sin nombre y main de instancia.
  • JEP 446 y 453: valores con ámbito y concurrencia estructurada.
  • JEP 442: la API de funciones externas y memoria, en su tercera preview.
  • JEP 448: la API vectorial, en su sexto incubador.

El mapa de la versión

ÁreaJEPQué trajo
Concurrencia444Hilos virtuales
Lenguaje441Patrones en switch
Lenguaje440Patrones de registro
Lenguaje430, 443, 445Plantillas, patrones sin nombre y clases sin nombre, en preview
Biblioteca431Colecciones secuenciadas
Biblioteca452API de encapsulación de claves
Biblioteca446, 453Valores con ámbito y concurrencia estructurada, en preview
Biblioteca442, 448Funciones externas y memoria, y API vectorial, sin cerrar
JVM439ZGC generacional, con bandera
JVM451Aviso al cargar agentes de forma dinámica
Deprecaciones449El puerto de Windows de 32 bits, marcado para retirar

Qué te llevas

  • Los hilos virtuales devuelven el código bloqueante al centro: una petición, un hilo.
  • El switch con patrones y deconstrucción sustituye cadenas de instanceof y cast.
  • Un switch exhaustivo sobre un sealed convierte el olvido en un error de compilación.
  • Las colecciones secuenciadas dan getFirst, getLast y reversed a todo lo que tiene orden.
  • ZGC generacional existe en 21, pero hay que pedirla con bandera.
  • Es la LTS de referencia para empezar un proyecto hoy: moderno y sin previews en el camino crítico.