Middle
O que são classes 'sealed' em Kotlin e em que casos devem ser usadas?
sobes.tech IA
Resposta da IA
A classe sealed é usada para representar uma hierarquia limitada de classes. Todos os subtipos diretos de uma classe sealed devem ser definidos no mesmo ficheiro que a própria classe sealed, ou nos mesmos módulos (para Kotlin 1.5+). Isto permite ao compilador verificar que todos os subtipos possíveis são tratados numa expressão when, tornando-a exaustiva sem necessidade de uma cláusula else.
Características principais:
- Todos os subtipos diretos devem estar localmente definidos.
- O construtor da classe
sealedéprivatepor padrão. - A classe
sealednão pode ser abstrata. - Não permite criar instâncias.
Casos de uso:
- Representação de um conjunto limitado de estados ou resultados. Por exemplo,
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>() } - Tratamento de variantes numa expressão
whencom garantia de exaustividade.fun processResult(result: Result<String>) { when (result) { is Result.Success -> println("Dados recebidos: ${result.data}") is Result.Error -> println("Erro: ${result.message}") Result.Loading -> println("A carregar...") } // Não é necessário uma cláusula else, pois o compilador conhece todos os subtipos. } - Uso como equivalente a enumerações com a capacidade de encapsular dados em cada variante.
Comparação com classes enum:
| Característica | enum class |
sealed class |
|---|---|---|
| Instâncias | Conjunto limitado de constantes nomeadas | Conjunto limitado de tipos |
| Dados nas variantes | Não (apenas propriedades) | Sim (através de subclasses) |
| Membros abstratos | Não | Sim |
| Herança | Não | Sim, mas limitada ao mesmo ficheiro/módulo |