Ir al contenido principal

Java Tip 31: lo nuevo de Java (21)

El JDK ha tenido varias cambios en los últimos años. Características nuevas se han sumando a las que apenas conocemos.

En está entrega conoceremos las características del JDK 21.

Comencemos con Java 21.

Tabla con las nuevas características del JDK 21

Característica Descripción
Patrones de registro (Record patterns) Permiten descomponer objetos de tipo record directamente en sentencias instanceof y switch, facilitando la escritura de código más conciso y seguro
Patrones de switch (Pattern matching for switch) Permite usar patrones en sentencias switch, mejorando la legibilidad y seguridad del código al trabajar con múltiples tipos y condiciones
Scoped values Proporciona una alternativa más segura y eficiente a las variables ThreadLocal, permitiendo el paso de datos inmutables a través de llamadas de métodos y hilos
Virtual Threads (Hilos virtuales) Permiten crear millones de hilos ligeros, facilitando la programación concurrente y escalable sin la sobrecarga de los hilos tradicionales
String Templates Introducen plantillas de cadena que permiten interpolación y formateo más seguro y legible de strings
Sequenced Collections Nuevas interfaces para colecciones ordenadas (SequencedCollection, SequencedSet, SequencedMap), proporcionando métodos consistentes para acceder a elementos en ambos extremos
Depuración y diagnóstico mejorados Mejoras en el monitoreo, diagnóstico y trazabilidad de aplicaciones Java, incluyendo nuevas opciones de JVM y herramientas de profiling
Mejoras en el lenguaje y la JVM Mejoras en rendimiento y eficiencia. Nuevas APIs y métodos en clases estandard. Depreciación y eliminación de APIs obsoletas
Actualizaciones de seguridad Refuerzos en la seguridad de la plataforma y nuevas opciones de configuración para entornos empresariales

Veamos unos ejemplos para comprender mejor estas características.

Nuevas características del JDK 21

Patrones de registro (Record patterns)

Ejemplo de clases tipo Record.

record Point(int x, int y) {}

static void print(Object obj) {
    if (obj instanceof Point(int x, int y)) {
        System.out.println("X: " + x + ", Y: " + y);
    }
}

Permiten descomponer objetos record directamente en patrones, facilitando el acceso a sus componentes.

Ventajas:

  • Menos código boilerplate
  • Más legible y declarativo.

Patrones de switch (Pattern matching for switch)

El switch ahora permite evaluar tipos y patrones complejos.

static String format(Object obj) {
    return switch (obj) {
        case Integer i -> "Entero: " + i;
        case String s -> "Texto: " + s;
        case Point(int x, int y) -> "Punto: " + x + "," + y;
        default -> "Desconocido";
    };
}

Ventajas:

  • Reemplaza múltiples if-else
  • Código más limpio y elegante.

Scoped values

Alternativa moderna a ThreadLocal para compartir datos de forma segura en hilos (especialmente virtuales).

static final ScopedValue<String> USER = ScopedValue.newInstance();

ScopedValue.where(USER, "Thomas Muller").run(() -> {
    System.out.println(USER.get());
});

Ventajas:

  • Más seguro que ThreadLocal.
  • Ideal para concurrencia estructurada.

Virtual Threads (Hilos virtuales)

Una de las mayores innovaciones (Proyecto Loom): permite crear millones de hilos ligeros.

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    executor.submit(() -> System.out.println("Hola desde hilo virtual"));
}

Ventajas:

  • Alta escalabilidad. 
  • Código sencillo (estilo síncrono). 
  • Reduce complejidad vs programación reactiva.

String Templates

Permite construir strings de manera más segura y flexible que concatenación.

String name = "Thomas Muller";
String message = STR."Hola \{name}";

También admite validación y procesamiento:

String sql = SQL."SELECT * FROM users WHERE name = \{name}";

Ventajas:

  • Evita errores de concatenación.
  • Facilita SQL seguro, HTML, etc.

Sequenced Collections

Nueva interfaz para colecciones con orden definido.

Nuevas APIs:

  • getFirst() 
  • getLast() 
  • addFirst() 
  • addLast()

Ejemplo:

SequencedCollection<String> list = new ArrayList<>();
list.addFirst("A");
list.addLast("B");

Ventajas:

  • APIs consistentes para listas, sets y maps.
  • Menos dependencia de implementaciones específicas.

Depuración y diagnóstico mejorados

Incluye mejoras como:

  • Mejor soporte para heap dumps.
  • Mejores herramientas de profiling.
  • JFR (Java Flight Recorder) más potente.
  • Diagnóstico mejorado de fallos de threads.

Ventajas:

  • Diagnóstico más rápido de problemas.
  • Producción más estable.

Mejoras en el lenguaje y la JVM

Incluyen:

  • Optimizaciones de rendimiento en JVM. 
  • Mejor recolección de basura (GC). 
  • Mejor manejo de memoria. 
  • Soporte optimizado para contenedores.

Ventajas:

  • Apps más rápidas.
  • Menor consumo de recursos.

Actualizaciones de seguridad

  • Nuevos algoritmos criptográficos.
  • Mejor validación de certificados.
  • Refuerzo en TLS y APIs de seguridad.

Ventajas:

  • Aplicaciones más seguras.
  • Cumplimiento de estándares modernos.

Enlaces:

https://medium.com/@qingedaig/jdk-21-features-49ba9740b80e
https://www.happycoders.eu/java/java-21-features/
https://ricardogeek.com/caracteristicas-de-java-21-una-guia-completa-con-ejemplos-de-codigo/


Comentarios

Entradas populares de este blog

Java Tip 1: Importaciones por default

Tip 1 : Todas las clases del paquete java.lang se importan por defecto. Podríamos hacer algo como esto: import java.lang.System ; import java.lang.String ; import java.lang.Boolean ; import java.lang.Integer ; import java.lang.Short ; import java.lang.StringBuilder ; import java.lang.StringBuffer ; O cosas (aberrantes) como: //Traernos todas las clases del paquete java.lang import java.lang.* ; Sin embargo, no es necesario. Repitamos esto como un mantra: Todas las clases del paquete  java.lang  se importan por defecto, no es necesario escribir de más .

Java Tip 28: hilos virtuales en Java

Con Java 21 entra un nuevo concepto: hilos virtuales java ( Java Virtual Threads ).  La cual es una nueva característica que nos permite crear miles o millones de hilos (tareas en paralelo). Los cuales se diferencian de los hilos comunes ( Platform Threads ) al no depender del sistema operativo , puesto que son virtuales. De estos se encargará la JVM. Al usar hilos virtuales ahorramos recursos del procesador y de memoria del sistema , sin importar si estamos creando y/o usando miles o millones. Los hilos virtuales son ideales para aplicaciones modernas donde se requiere esperar y recibir respuestas o acceder a bases de datos remotas, entre otras cosas. Además no impide usar los hilos comunes que dependen del sistema operativo. Observemos un ejemplo de uso de hilos virtuales. VirtualThreadsDemo.java package com.comunidad.demo; public class VirtualThreadsDemo { public static void main (String [] args) throws InterruptedException { // Crear un Virtual Th...

Java Tip 20: JDBC (2da parte)

Continuamos con esta serie sobre JDBC . Como dijimos la vez anterior JDBC( Java Database Connectivity ) es el estándar de conectividad de bases de datos de Java y proporciona un mecanismo para que los programas Java se conecten a las bases de datos. En este post veremos ejemplos de su uso. Requisitos: Tener nociones de Java.  Tener nociones de SQL (usaremos H2). Tener nociones de Maven. Creando una aplicación JDBC Crearemos una sencilla aplicación que se conecte a una BD H2 (ver  tutorial ). Pasos: Crearemos una tabla a la que llamaremos Cursos. La cual tendrá los siguientes campos: id, titulo, materia, instructor, fecha y hora. Crear la aplicación Java usando Maven. Crearemos instrucciones SQL para consultar la información, ingresar nuevos cursos, actualizar y eliminar registros. Ejecutar la aplicación con Maven. 1. Creamos la tabla con sus seis campos (agregaremos los datos con la aplicación Java): CREATE OR REPLACE TABLE CURSOS( id bigint ...