Java moderno: var, records, sealed classes y pattern matching

Las novedades de Java 10 a 21 que escriben menos y mejor: inferencia con var, records, switch expressions, pattern matching, sealed y text blocks.

El Java que se escribe hoy es más corto que el de hace 10 años. Estas son las mejoras más útiles, disponibles en las versiones con soporte largo (LTS): Java 17 y Java 21.

var: inferencia de tipos

En variables locales, var deja que el compilador deduzca el tipo por el valor de la derecha. No es tipado dinámico: la variable sigue teniendo un tipo fijo, solo que no lo escribes.

records: datos inmutables sin código repetido

Un record es una clase para llevar datos. En una línea generas: constructor, getters (x(), y()), equals(), hashCode() y toString().

switch expressions y pattern matching

El switch moderno devuelve un valor y, con pattern matching, puede ramificar según el tipo del objeto y extraer sus datos a la vez.

String describir(Object o) {
    return switch (o) {
        case Integer i  -> "entero: " + i;
        case String s   -> "texto de " + s.length() + " letras";
        case Punto(int x, int y) -> "punto (" + x + ", " + y + ")";
        case null       -> "nada";
        default         -> "otro tipo";
    };
}

sealed: jerarquías cerradas

sealed declara exactamente qué clases pueden heredar. El compilador lo sabe, así que un switch sobre esos tipos no necesita default: sabe que están todos.

sealed interface Figura permits Circulo, Rectangulo {}
record Circulo(double radio) implements Figura {}
record Rectangulo(double base, double altura) implements Figura {}

double area(Figura f) {
    return switch (f) {                 // sin default: el compilador sabe que están todas
        case Circulo c     -> Math.PI * c.radio() * c.radio();
        case Rectangulo r  -> r.base() * r.altura();
    };
}

Comprueba lo aprendido