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.