Sobes.tech
Middle

¿Qué son las clases 'sealed' en Kotlin y en qué casos se deben usar?

sobes.tech AI

Respuesta de la IA

La clase sealed se utiliza para representar una jerarquía limitada de clases. Todos los subtipos directos de una clase sealed deben estar definidos en el mismo archivo que la clase sealed o en los mismos módulos (para Kotlin 1.5+). Esto permite que el compilador verifique que todos los subtipos posibles sean manejados en una expresión when, haciéndola exhaustiva sin necesidad de una rama else.

Características clave:

  • Todos los subclases directas deben estar en el mismo archivo.
  • El constructor de la clase sealed es private por defecto.
  • La clase sealed no puede ser abstracta.
  • No permite crear instancias.

Casos de uso:

  • Representación de un conjunto limitado de estados o resultados. Por ejemplo, Loading, Success(data), Error(message).
    sealed class Result<out T> {
       data class Success<T>(val data: T) : Result<T>()
       data class Error(val message: String) : Result<Nothing>()
       object Loading : Result<Nothing>()
    }
    
  • Manejo de variantes en una expresión when con garantía de exhaustividad.
    fun processResult(result: Result<String>) {
       when (result) {
          is Result.Success -> println("Datos recibidos: ${result.data}")
          is Result.Error -> println("Error: ${result.message}")
          Result.Loading -> println("Cargando...")
       }
       // No es necesario una rama else, ya que el compilador conoce todos los subtipos.
    }
    
  • Uso como equivalente a enumeraciones con la capacidad de encapsular datos en cada variante.

Comparación con clases enum:

Característica enum class sealed class
Instancias Conjunto limitado de constantes nombradas Conjunto limitado de tipos
Datos en variantes No (solo propiedades) Sí (a través de subclases)
Miembros abstractos No
Herencia No Sí, pero limitada al mismo archivo/módulo