Con la evolución de Java, dos características han tomado mayor protagonismo: las clases selladas (sealed classes) y el coincidencia de patrones (pattern matching). La combinación de ambas permite escribir código más seguro, expresivo y mantenible.
Las clases selladas permiten restringir qué clases pueden extender o implementar una clase o interfaz. Se declaran con la palabra clave sealed y deben especificar sus subclases con permits.
Por ejemplo:
public sealed class Figura permits Circulo, Poligono {}
public final class Circulo extends Figura {}
public sealed class Poligono extends Figura permits Triangulo {}
public non-sealed class Triangulo extends Poligono {}
Aquí, Figura solo puede ser extendida por Circulo y Poligono, mientras que Triangulo puede ser extendido libremente.
El pattern matching simplifica la lógica condicional al combinar la comprobación de tipos y la conversión en una sola operación.
Por ejemplo:
Object obj = "Hola, mundo!";
if (obj instanceof String s) {
System.out.println(s.toUpperCase());
}
Si obj es un String, se asigna automáticamente a s, evitando el casting manual.
Tambien lo podemos usar con switch:
static void procesar(Object obj) {
switch (obj) {
case String s -> System.out.println("Es una cadena: " + s.toUpperCase());
case Integer i -> System.out.println("Es un número: " + (i * 2));
default -> System.out.println("Tipo no soportado");
}
}
El switch maneja diferentes tipos de objetos de manera más clara y concisa.
La combinación de ambas características permite que el compilador conozca todas las posibles subclases en tiempo de compilación, facilitando el uso de switch y garantizando que se manejen todos los casos.
Por ejemplo:
public sealed interface Operacion permits Suma, Resta, Multiplicacion {}
public record Suma(int a, int b) implements Operacion {}
public record Resta(int a, int b) implements Operacion {}
public record Multiplicacion(int a, int b) implements Operacion {}
public int evaluar(Operacion op) {
return switch (op) {
case Suma s -> s.a() + s.b();
case Resta r -> r.a() - r.b();
case Multiplicacion m -> m.a() * m.b();
};
}
Aquí, el switch cubre todas las implementaciones posibles de Operacion, asegurando que no haya casos no manejados.
Las clases selladas y el pattern matching en Java permiten escribir código más seguro y expresivo. Al proporcionar control sobre la herencia y simplificar la lógica condicional, facilitan la creación de software más mantenible y alineado con las tendencias modernas del desarrollo en Java.