Middle
Estás familiarizado com classes seladas e qual é a sua característica?
sobes.tech IA
Resposta da IA
Sim, conheço.
A característica das classes sealed é que elas permitem limitar a hierarquia de herança. Todos os subtipos diretos de uma classe sealed devem ser declarados no mesmo ficheiro. Isto garante que o compilador conhece todos os subtipos possíveis, o que é útil para verificar a exaustividade em expressões when.
Exemplo:
sealed class Result {
data class Success(val message: String) : Result()
data class Error(val code: Int, val description: String) : Result()
object Loading : Result() // Singleton para o estado de carregamento
}
fun processResult(result: Result) {
when (result) {
is Result.Success -> println("Sucesso: ${result.message}")
is Result.Error -> println("Erro ${result.code}: ${result.description}")
Result.Loading -> println("A carregar...")
// Não é necessário um else, pois o compilador conhece todas as opções
}
}
Vantagens:
- Segurança: Garante a exaustividade das expressões
whensem necessidade deelse. - Legibilidade: Indica claramente um conjunto limitado de estados ou subtipos possíveis.
- Controlo: Impede herança não controlada de fora.
Diferença de enum class: As classes sealed podem ter diferentes tipos de dados para cada subtipo (como Success e Error no exemplo), enquanto que os elementos de enum class são estáticos e podem ter apenas propriedades definidas, comuns a todos. As classes sealed também podem ter instâncias-objetos (Loading).