ProgramaciónDesarrollador de Kotlin, Desarrollador Backend, Desarrollador de Android

¿Cómo se implementan las interfaces selladas en Kotlin? ¿Para qué se utilizan, cómo se usan y en qué se diferencian de las clases selladas?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

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:

  • las interfaces selladas solo pueden ser implementadas dentro del mismo archivo;
  • las interfaces selladas no almacenan estado, pero sus implementaciones pueden ser clases con estado u objetos;
  • manejo exhaustivo de expresiones when sobre la interfaz sellada.

Preguntas capciosas.

¿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.

Errores comunes y anti-patrón

  • Implementación de una interfaz sellada fuera del archivo con su declaración (el compilador no lo permitirá).
  • Abuso de las interfaces selladas para una mayor rigidez — puede llevar a una complejidad excesiva de la arquitectura.
  • Intento de crear instancias de la interfaz sellada directamente — imposible: solo implementaciones/objetos concretos.

Ejemplo de la vida real

Caso negativo

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:

  • Arquitectura rápidamente implementada
  • Flexibilidad en la implementación

Desventajas:

  • Expansión incontrolada de la jerarquía
  • Las expresiones when no son controladas por el compilador para una cobertura completa

Caso positivo

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:

  • Control total sobre la jerarquía
  • Soporte para el manejo exhaustivo de situaciones en tiempo de compilación

Desventajas:

  • Todas las implementaciones deben estar en un solo archivo, lo que aumenta el tamaño del archivo con un gran número de variaciones