🧊 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
sealedrestringe la herencia.permitsdefine las clases permitidas.- Las clases hijas deben ser:
finalsealednon-sealed- Permite modelar jerarquías cerradas y seguras.