Interface sellada — es un tipo especial de interfaz en Kotlin que permite restringir el conjunto de sus implementaciones dentro de un mismo módulo. Las clases selladas aparecieron en Kotlin antes, y las interfaces selladas se añadieron a partir de Kotlin 1.5 como una evolución para un mayor control sobre los tipos que participan, por ejemplo, en jerarquías de estados o en el manejo de eventos.
Anteriormente, los desarrolladores utilizaban clases selladas para limitar la herencia y crear jerarquías seguras. Sin embargo, para mayor flexibilidad y el soporte de estructuras donde la herencia de múltiples tipos es útil, se necesitaban interfaces selladas.
Sin interfaces selladas, no se puede gestionar de forma flexible el conjunto de subclases de la interfaz. Esto hace imposible, por ejemplo, una verificación exhaustiva en cuando se manejan estados, si todo está construido sobre interfaces y no solo sobre clases abstractas/concretas.
El uso de interface sellada permite:
Ejemplo de código:
sealed interface Event class Click : Event class Scroll : Event fun handle(event: Event) = when(event) { is Click -> println("Evento de clic") is Scroll -> println("Evento de desplazamiento") }
Características clave:
¿Pueden las interfaces selladas tener implementaciones fuera del archivo de su declaración?
No, las implementaciones de una interfaz sellada deben estar en el mismo módulo. Esto asegura la exhaustividad total y permite al compilador controlar su cantidad.
¿Cómo interactúan las interfaces selladas con las clases y objetos?
Una interfaz sellada puede ser implementada tanto por clases normales como por objetos, así como objetos de datos (Kotlin 1.9+). Esta interfaz puede estar presente en herencia múltiple, lo que no se puede hacer con una clase sellada.
sealed interface Operation object Add: Operation object Subtract: Operation
¿Pueden las interfaces selladas ser anidadas?
Sí, se puede declarar una interfaz sellada tanto dentro de otra clase sellada como sobre otras interfaces. Lo importante es que todas las implementaciones estén dentro de un mismo módulo.
En la aplicación, los estados de UI se describieron simplemente como interfaces sin el modificador sellado. Se olvidó una implementación, el análisis estático no lo detectó; el error surgió solo en producción.
Ventajas:
Desventajas:
Uso de la interfaz sellada para el modelo de eventos de pantalla. Todas las implementaciones están dentro de un solo archivo del módulo, el compilador avisa sobre ramas no cerradas cuando se omite un caso en cuando.
Ventajas:
Desventajas: