Las interfaces selladas son una funcionalidad relativamente nueva en Kotlin (desde la versión 1.5), diseñada para limitar el conjunto de implementaciones de una interfaz dentro de un solo archivo. Originalmente en Kotlin existían clases selladas, que proporcionaban un control estricto sobre la jerarquía de herencia, facilitando el manejo exhaustivo (por ejemplo, en expresiones when).
El problema era que a veces la arquitectura requería no una clase base, sino una interfaz con la misma limitación en el número de implementaciones. Antes de la llegada de las interfaces selladas, la única forma de ajustarse a las restricciones del compilador era utilizar una clase sellada, lo que no siempre se integraba bien en el modelo del dominio, especialmente cuando se necesitaba herencia múltiple o descomposición del comportamiento en interfaces.
La solución: Las interfaces selladas permiten definir una interfaz, todas las implementaciones de la cual deben ser declaradas dentro de un solo archivo. Esto aumenta la seguridad del código y facilita el control y la navegación a través de la jerarquía de estados o eventos.
Ejemplo de código:
sealed interface NetworkState class Success(val data: String) : NetworkState class Error(val code: Int) : NetworkState object Loading : NetworkState
Características clave:
¿Se puede implementar una interfaz sellada fuera del archivo donde se declara?
No. Al igual que las clases selladas, las interfaces selladas solo se pueden implementar en el mismo archivo que su declaración. Fuera del archivo, intentar implementar tal interfaz provocará un error de compilación.
¿Se puede heredar una interfaz sellada de una clase?
No, las interfaces solo pueden heredar de otras interfaces. Pero una interfaz sellada puede heredar de otra interfaz (sellada).
¿Soporta la interfaz sellada la implementación múltiple?
Sí, una clase dentro de este mismo archivo puede implementar varias interfaces selladas o incluso heredar simultáneamente una interfaz sellada y una clase sellada, si se permite según las reglas del lenguaje.
En el sistema de procesamiento de eventos de red, el desarrollador utiliza interfaces comunes y clases selladas entremezcladas, resultando en una jerarquía "sucia" y duplicación de código. Las expresiones when se ven obligadas a incluir una rama else.
Ventajas:
Desventajas:
En esta misma aplicación, se pasa a la interfaz sellada NetworkEvent, colocando todas las implementaciones en un solo archivo. Ahora, las expresiones when sobre NetworkEvent requieren manejar todos los casos. El código se vuelve más legible, mantenible y seguro.
Ventajas:
Desventajas: