Saltar a contenido

🧊 Sealed Classes en Java

🎯 ¿Qué es una sealed class?

Una sealed class es una clase que restringe qué clases pueden heredar de ella.

Normalmente en Java cualquier clase puede extender otra:

class Animal {}
class Perro extends Animal {}
class Gato extends Animal {}
class Robot extends Animal {}

Con sealed classes, el autor de la clase controla exactamente quién puede heredar.

public sealed class Animal permits Perro, Gato {
}

Ahora solo estas clases pueden extenderla.


🧩 Tipos de clases permitidas

Las clases que aparecen en permits deben declararse de una de estas tres formas.

🔒 final

La jerarquía termina ahí.

public final class Perro extends Animal {
}

🧊 sealed

La jerarquía sigue siendo restringida.

public sealed class Gato extends Animal permits GatoDomestico {
}

🔓 non-sealed

Rompe la restricción y vuelve a permitir herencia libre.

public non-sealed class Gato extends Animal {
}

📌 Ejemplo completo

public sealed class Vehiculo permits Coche, Moto, Bicicleta {
    public abstract int ruedas();
}

Implementaciones

public final class Coche extends Vehiculo {
    public int ruedas() {
        return 4;
    }
}
public sealed class Moto extends Vehiculo permits MotoDeportiva {
    public int ruedas() {
        return 2;
    }
}
public final class MotoDeportiva extends Moto {
}
public non-sealed class Bicicleta extends Vehiculo {
    public int ruedas() {
        return 2;
    }
}

⚙️ Reglas importantes

📌 1. Debes declarar permits

public sealed class Shape permits Circle, Rectangle {}

Puede omitirse si las clases están en el mismo fichero.


📌 2. Las clases permitidas deben declarar

Una de estas palabras clave:

final
sealed
non-sealed

Si no, no compila.


📌 3. Deben estar en el mismo módulo o paquete

Para que el compilador pueda verificar la jerarquía.


🧠 ¿Para qué sirven las sealed classes?

Sirven para modelar jerarquías cerradas.

Ejemplos típicos:

  • Tipos de pagos
  • Tipos de expresiones
  • Tipos de eventos
  • Tipos de estados

Ejemplo:

public sealed class Pago permits Bizum, Tarjeta, Efectivo {}

Esto garantiza que solo existen esos tipos de pago.


🚀 Ventaja con pattern matching

Las sealed classes permiten que el compilador verifique que cubres todos los casos.

static String tipo(Pago p) {
    if (p instanceof Bizum) return "BIZUM";
    if (p instanceof Tarjeta) return "TARJETA";
    if (p instanceof Efectivo) return "EFECTIVO";
}

Como la jerarquía está cerrada, el compilador sabe que no hay más tipos.


⚔️ Sealed class vs abstract class

Característica abstract class sealed class
Puede tener atributos
Puede tener métodos abstractos
Controla quién hereda
Jerarquía cerrada

✅ Mini‑resumen

  • sealed restringe la herencia.
  • permits define las clases permitidas.
  • Las clases hijas deben ser:
  • final
  • sealed
  • non-sealed
  • Permite modelar jerarquías cerradas y seguras.