O que é Sealed Class em Kotlin?
Uma sealed class em Kotlin define uma hierarquia restrita de tipos. Isso significa que todas as subclasses possíveis são conhecidas em tempo de compilação. É como um enum turbinado — cada subtipo pode ter propriedades e comportamentos diferentes.
A grande vantagem é que, ao usar when, o compilador sabe exatamente quais são os casos possíveis e avisa se você esquecer algum.
Sintaxe básica
sealed class Resultado {
data class Sucesso(val dados: String) : Resultado()
data class Erro(val mensagem: String, val codigo: Int) : Resultado()
object Carregando : Resultado()
}
Cada subclasse pode ter seus próprios campos e lógica. Diferente de um enum, onde cada valor é uma instância única, aqui cada subtipo pode carregar dados distintos.
Usando com when
A mágica acontece quando você combina sealed class com when:
fun tratarResultado(resultado: Resultado): String {
return when (resultado) {
is Resultado.Sucesso -> "Deu certo: ${resultado.dados}"
is Resultado.Erro -> "Erro ${resultado.codigo}: ${resultado.mensagem}"
is Resultado.Carregando -> "Aguarde..."
}
}
Repare que não precisa de else. O compilador sabe que esses são todos os casos possíveis. Se amanhã você adicionar um novo subtipo, o compilador vai apontar todos os lugares onde falta tratar o novo caso.
Exemplo prático com estado de tela
sealed class EstadoTela {
object Inicial : EstadoTela()
data class Conteudo(val itens: List<String>) : EstadoTela()
data class FalhaConexao(val tentativas: Int) : EstadoTela()
}
fun renderizar(estado: EstadoTela) {
when (estado) {
is EstadoTela.Inicial -> println("Carregando tela inicial...")
is EstadoTela.Conteudo -> println("Exibindo ${estado.itens.size} itens")
is EstadoTela.FalhaConexao -> println("Falha! Tentativa ${estado.tentativas}")
}
}
Quando usar?
Sealed classes são ideais para modelar estados finitos: resultados de operações, estados de UI, eventos de navegação e respostas de rede. Sempre que você tiver um conjunto fechado de possibilidades, pense em sealed class.