ProgramaciónDesarrollador Android/Kotlin

¿Qué son las interfaces selladas en Kotlin, cómo y por qué se utilizan?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

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.

Historia del tema

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.

Problema

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.

Solución

El uso de interface sellada permite:

  • Describir un conjunto fijo de implementaciones.
  • Garantizar que todas las implementaciones son conocidas por el compilador.
  • Usar de forma segura cuando sin rama else — el compilador señalará los casos no cubiertos.

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:

  • Restricción y control del conjunto de implementaciones permitidas.
  • Posibilidad de heredar de múltiples interfaces selladas simultáneamente.
  • Seguridad en el pattern matching (cuando).

Preguntas capciosas.

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

Errores típicos y anti-patrones

  • Definir implementaciones de una interfaz sellada en diferentes módulos conduce a errores de compilación.
  • Intentar usar una interfaz sellada asumiendo que es como una clase sellada, aunque la interfaz sellada puede ser heredada por otras interfaces.

Ejemplo de la vida real

Caso negativo

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:

  • Patrón familiar de interfaces de Java.

Desventajas:

  • Sin garantías de exhaustividad en cuando.
  • Vulnerabilidad a la aparición de implementaciones "exteriores".

Caso positivo

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:

  • Total seguridad de tipos.
  • Facilidad de soporte y expansión.

Desventajas:

  • Uso solo dentro del mismo módulo.