sealed class e interface en Kotlin — qué es, sintaxis y aplicación

Autor: IT Sectr Publicado: 2026-06-20 Tiempo de lectura: 11 min

sealed class y sealed interface en Kotlin son mecanismos de jerarquía acotada de tipos, donde todas las subclases posibles se conocen en tiempo de compilación. A diferencia de las clases abstractas normales, sealed class garantiza un manejo exhaustivo de todas las variantes en una expresión when. Según la documentación de JetBrains Kotlin Language Guide (2026), los tipos sealed son la base para modelar estados, pantallas de UI y tipos de resultado en proyectos Kotlin.

Puntos clave

  • sealed — jerarquía acotada donde todas las subclases se conocen en tiempo de compilación
  • when — manejo exhaustivo de todas las subclases sin bloque else obligatorio
  • sealed interface — añadido en Kotlin 1.5 para jerarquías flexibles sin restricciones de herencia
  • Compilación — error de compilación cuando el when está incompleto para tipos sealed
  • Jerarquía — todas las subclases deben estar en el mismo archivo o dentro de la clase sealed

¿Qué son sealed class y sealed interface?

sealed class es una clase abstracta con una restricción: todas sus subclases directas deben declararse en el mismo archivo que la propia sealed class. Esta restricción hace que la jerarquía sea cerrada (sealed) — ningún código fuera del archivo puede añadir una nueva subclase.

sealed interface, añadido en Kotlin 1.5, proporciona la misma garantía pero con la flexibilidad de una interfaz: una sealed interface puede ser implementada por múltiples clases, objetos u otras interfaces en un mismo archivo. A diferencia de sealed class, sealed interface no tiene restricción de herencia única — una clase puede implementar varias interfaces sealed a la vez.

Según Kotlin Evolution and Roadmap (2026), sealed interface se añadió por petición de la comunidad para un modelado más flexible. La motivación principal es la capacidad de combinar jerarquías de tipos independientes sin herencia múltiple de clases.

Sintaxis de sealed class

La declaración de una sealed class comienza con el modificador sealed antes de class. Las subclases se declaran en el mismo archivo.

kotlin
sealed class NetworkResult {
    data class Success(val data: String) : NetworkResult()
    data class Error(val message: String) : NetworkResult()
    object Loading : NetworkResult()
}

Cada subclase de una sealed class puede tener sus propias propiedades y métodos. Loading es un singleton (object), Success y Error son data classes con parámetros. El compilador conoce las tres variantes y verifica su integridad cuando se usan en when.

Sealed classes anidadas

Las clases sealed pueden anidarse, creando jerarquías de múltiples niveles para modelos de datos complejos sin perder type safety.

kotlin
sealed class UiState {
    object Idle : UiState()
    object Loading : UiState()
    data class Content(val items: List<Item>) : UiState()
    data class Error(val exception: Throwable) : UiState()
}

Sintaxis de sealed interface (Kotlin 1.5+)

sealed interface se declara de forma similar a sealed class, pero permite implementar varias interfaces sealed en una sola clase.

kotlin
sealed interface Action
sealed interface Loggable

data class Navigate(val route: String) : Action, Loggable
data class ShowToast(val text: String) : Action
object GoBack : Action, Loggable

La clase Navigate implementa dos interfaces sealed a la vez — Action y Loggable. Esto es imposible con sealed class debido a la restricción de herencia única. sealed interface proporciona la flexibilidad de combinar jerarquías independientes.

Cuándo elegir sealed interface en lugar de sealed class

sealed interface es preferible cuando la jerarquía no requiere estado compartido ni constructor. Según las JetBrains Kotlin Guidelines (2026), sealed interface debe usarse por defecto para todas las jerarquías nuevas donde no se necesite un constructor común, lo que hace el código más flexible para futuras extensiones.

Manejo exhaustivo en when

La principal ventaja de los tipos sealed es el manejo exhaustivo en la expresión when. El compilador verifica que todas las subclases posibles estén cubiertas.

kotlin
fun handleResult(result: NetworkResult): String = when (result) {
    is NetworkResult.Success -> "Data: ${result.data}"
    is NetworkResult.Error -> "Error: ${result.message}"
    is NetworkResult.Loading -> "Loading..."
    // else no es necesario — el compilador sabe que todas las variantes están cubiertas
}

Si un desarrollador añade una nueva subclase a una jerarquía sealed pero olvida manejarla en when — el compilador lanzará un error. Esto es seguridad a nivel de tipos, no disponible con jerarquías abiertas que usan rama else.

Según Google Android Developers (2026), las clases sealed son la forma recomendada de modelar el estado de UI en Jetpack Compose. La verificación exhaustiva de when previene estados en los que el desarrollador no ha manejado todas las variantes posibles de visualización de una pantalla.

Comparación sealed class con enum class

enum class y sealed class a menudo se confunden, pero tienen diferentes propósitos y capacidades.

Característicasealed classenum class
InstanciasMúltiples (data class), una (object)Exactamente una por constante
PropiedadesDiferentes para cada subclaseIguales para todas las constantes
HerenciaSí (de sealed class)No (implícitamente final)
ConstructorPuede tener parámetrosSolo compartido para todas las constantes
JerarquíaAcotada, sealedConjunto fijo de constantes

La elección entre sealed class y enum class depende de la tarea. Si las variantes no llevan datos adicionales — use enum. Si cada variante contiene campos únicos — use sealed class o sealed interface.

Escenarios prácticos de uso

Los tipos sealed se usan en proyectos Kotlin para una serie de escenarios estándar donde se requiere modelado type-safe.

Estado de UI en Jetpack Compose

Cada pantalla de Compose puede tener una sealed class UiState que describa todos los estados posibles: Idle, Loading, Content(data), Error(exception). La expresión when garantiza que todos los estados sean manejados.

Resultados de solicitudes de red

NetworkResult con las variantes Success, Error, Loading es un patrón estándar en proyectos Kotlin con Retrofit y Ktor. sealed class proporciona un manejo seguro de cada resultado de la solicitud.

Navegación en proyectos multi-módulo

sealed interface para rutas de navegación permite que los módulos declaren sus propias rutas manteniéndose dentro de una jerarquía unificada. Esto elimina errores con rutas desconocidas en tiempo de compilación.

Según KotlinConf (2025), sealed class y sealed interface son la base del diseño type-safe en aplicaciones Kotlin modernas. Se combinan con data class para modelar estructuras de dominio complejas sin perder seguridad en tiempo de compilación.

Preguntas frecuentes

¿Dónde deben declararse las subclases de sealed class?

Todas las subclases directas de una sealed class deben declararse en el mismo archivo. Para sealed interface aplica la misma regla — implementaciones en un mismo archivo.

¿Puede una sealed interface tener implementaciones en otro archivo?

No, la regla de un solo archivo también aplica para sealed interface. Todas las implementaciones deben estar en el archivo donde se declara la sealed interface.

¿Cuál es la diferencia entre sealed class y sealed interface?

sealed interface no tiene estado ni constructor y permite implementación múltiple. sealed class puede tener constructor y estado compartido, pero una clase solo puede heredar de una sealed class.

¿Cómo ayudan las clases sealed en las expresiones when?

El compilador verifica la integridad de when: si no se manejan todas las subclases, el código no compila. Esto elimina errores en tiempo de ejecución y hace el código más seguro.

¿Puede una sealed class tener constructor?

Sí, una sealed class puede tener constructor (privado por defecto). Todas las subclases pueden pasar parámetros a este constructor mediante super().

Resumen

  • sealed class — jerarquía acotada con subclases conocidas en tiempo de compilación
  • sealed interface — alternativa flexible (Kotlin 1.5+) con soporte de implementación múltiple
  • when — manejo exhaustivo con verificación del compilador, sin else requerido
  • Un archivo — todas las subclases e implementaciones deben estar en el mismo archivo que el tipo sealed
  • Modelado — estados de UI, resultados de red, navegación, sistemas de eventos
  • Seguridad — añadir una nueva subclase sin manejo en when causa un error de compilación
  • Elección — sealed interface es preferible por defecto, sealed class cuando se necesita estado compartido

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también