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
sealedesprivatepor defecto. - La clase
sealedno 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
whencon 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 | Sí |
| Herencia | No | Sí, pero limitada al mismo archivo/módulo |