sealed class e interface em Kotlin — o que é, sintaxe e aplicação

Autor: IT Sectr Publicado: 2026-06-20 Tempo de leitura: 11 min

sealed class e sealed interface em Kotlin são mecanismos de hierarquia limitada de tipos, onde todas as subclasses possíveis são conhecidas em tempo de compilação. Ao contrário das classes abstratas comuns, sealed class garante o tratamento exaustivo de todas as variantes em uma expressão when. De acordo com a documentação JetBrains Kotlin Language Guide (2026), os tipos sealed são a base para modelar estados, telas de UI e tipos de resultado em projetos Kotlin.

Pontos principais

  • sealed — hierarquia limitada onde todas as subclasses são conhecidas em tempo de compilação
  • when — tratamento exaustivo de todas as subclasses sem bloco else obrigatório
  • sealed interface — adicionado no Kotlin 1.5 para hierarquias flexíveis sem restrições de herança
  • Compilação — erro de compilação para when incompleto em tipos sealed
  • Hierarquia — todas as subclasses devem estar no mesmo arquivo ou dentro da classe sealed

O que são sealed class e sealed interface?

sealed class é uma classe abstrata com uma restrição: todas as suas subclasses diretas devem ser declaradas no mesmo arquivo que a própria sealed class. Essa restrição torna a hierarquia fechada (sealed) — nenhum código fora do arquivo pode adicionar uma nova subclasse.

sealed interface, adicionada no Kotlin 1.5, fornece a mesma garantia mas com a flexibilidade de uma interface: uma sealed interface pode ser implementada por múltiplas classes, objetos ou outras interfaces em um arquivo. Ao contrário de sealed class, sealed interface não tem restrição de herança única — uma classe pode implementar várias interfaces sealed ao mesmo tempo.

De acordo com Kotlin Evolution and Roadmap (2026), sealed interface foi adicionada por solicitação da comunidade para modelagem mais flexível. A principal motivação é a capacidade de combinar hierarquias de tipos independentes sem herança múltipla de classes.

Sintaxe de sealed class

A declaração de uma sealed class começa com o modificador sealed antes de class. As subclasses são declaradas no mesmo arquivo.

kotlin
sealed class NetworkResult {
    data class Success(val data: String) : NetworkResult()
    data class Error(val message: String) : NetworkResult()
    object Loading : NetworkResult()
}

Cada subclasse de uma sealed class pode ter suas próprias propriedades e métodos. Loading é um singleton (object), Success e Error são data classes com parâmetros. O compilador conhece todas as três variantes e verifica sua completeza quando usadas em when.

Sealed classes aninhadas

As classes sealed podem ser aninhadas, criando hierarquias de vários níveis para modelos de dados complexos sem perder type safety.

kotlin
sealed class UiState {
    object Idle : UiState()
    object Loading : UiState()
    data class Content(val items: List<Item>) : UiState()
    data class Error(val exception: Throwable) : UiState()
}

Sintaxe de sealed interface (Kotlin 1.5+)

sealed interface é declarada de forma semelhante a sealed class, mas permite implementar várias interfaces sealed em uma única classe.

kotlin
sealed interface Action
sealed interface Loggable

data class Navigate(val route: String) : Action, Loggable
data class ShowToast(val text: String) : Action
object GoBack : Action, Loggable

A classe Navigate implementa duas interfaces sealed ao mesmo tempo — Action e Loggable. Isso é impossível com sealed class devido à restrição de herança única. sealed interface oferece a flexibilidade de combinar hierarquias independentes.

Quando escolher sealed interface em vez de sealed class

sealed interface é preferível quando a hierarquia não requer estado compartilhado ou construtor. De acordo com as JetBrains Kotlin Guidelines (2026), sealed interface deve ser usada por padrão para todas as hierarquias novas onde um construtor comum não é necessário, tornando o código mais flexível para extensões futuras.

Tratamento exaustivo em when

A principal vantagem dos tipos sealed é o tratamento exaustivo na expressão when. O compilador verifica que todas as subclasses possíveis estão cobertas.

kotlin
fun handleResult(result: NetworkResult): String = when (result) {
    is NetworkResult.Success -> "Data: ${result.data}"
    is NetworkResult.Error -> "Error: ${result.message}"
    is NetworkResult.Loading -> "Loading..."
    // else não é necessário — o compilador sabe que todas as variantes estão cobertas
}

Se um desenvolvedor adicionar uma nova subclasse a uma hierarquia sealed mas esquecer de tratá-la no when — o compilador lançará um erro. Isso é segurança no nível de tipos, indisponível com hierarquias abertas que usam ramo else.

De acordo com Google Android Developers (2026), as classes sealed são a forma recomendada de modelar estado de UI no Jetpack Compose. A verificação exaustiva de when previne estados onde o desenvolvedor não tratou todas as variantes possíveis de exibição de uma tela.

Comparação sealed class com enum class

enum class e sealed class são frequentemente confundidas, mas têm propósitos e capacidades diferentes.

Característicasealed classenum class
InstânciasMúltiplas (data class), uma (object)Exatamente uma por constante
PropriedadesDiferentes para cada subclasseMesmas para todas as constantes
HerançaSim (de sealed class)Não (implicitamente final)
ConstrutorPode ter parâmetrosApenas compartilhado para todas as constantes
HierarquiaLimitada, sealedConjunto fixo de constantes

A escolha entre sealed class e enum class depende da tarefa. Se as variantes não carregam dados adicionais — use enum. Se cada variante contém campos únicos — use sealed class ou sealed interface.

Cenários práticos de uso

Os tipos sealed são usados em projetos Kotlin para uma série de cenários padrão onde a modelagem type-safe é necessária.

Estado de UI no Jetpack Compose

Cada tela Compose pode ter uma sealed class UiState descrevendo todos os estados possíveis: Idle, Loading, Content(data), Error(exception). A expressão when garante que todos os estados sejam tratados.

Resultados de requisições de rede

NetworkResult com as variantes Success, Error, Loading é um padrão comum em projetos Kotlin com Retrofit e Ktor. sealed class garante o tratamento seguro de cada resultado de requisição.

Navegação em projetos multi-módulo

sealed interface para rotas de navegação permite que módulos declarem suas próprias rotas enquanto permanecem dentro de uma hierarquia unificada. Isso elimina erros com rotas desconhecidas em tempo de compilação.

De acordo com KotlinConf (2025), sealed class e sealed interface são a base do design type-safe em aplicações Kotlin modernas. Elas se combinam com data class para modelar estruturas de domínio complexas sem perder segurança em tempo de compilação.

Perguntas frequentes

Onde as subclasses de sealed class devem ser declaradas?

Todas as subclasses diretas de uma sealed class devem ser declaradas no mesmo arquivo. Para sealed interface aplica-se a mesma regra — implementações em um arquivo.

Uma sealed interface pode ter implementações em outro arquivo?

Não, a regra de arquivo único também se aplica a sealed interface. Todas as implementações devem estar no arquivo onde a sealed interface é declarada.

Qual a diferença entre sealed class e sealed interface?

sealed interface não tem estado nem construtor e permite implementação múltipla. sealed class pode ter construtor e estado compartilhado, mas uma classe só pode herdar de uma sealed class.

Como as classes sealed ajudam em expressões when?

O compilador verifica a completeza do when: se nem todas as subclasses são tratadas, o código não compila. Isso elimina erros em tempo de execução e torna o código mais seguro.

Uma sealed class pode ter construtor?

Sim, uma sealed class pode ter construtor (privado por padrão). Todas as subclasses podem passar parâmetros para este construtor via super().

Resumo

  • sealed class — hierarquia limitada com subclasses conhecidas em tempo de compilação
  • sealed interface — alternativa flexível (Kotlin 1.5+) com suporte a implementação múltipla
  • when — tratamento exaustivo com verificação do compilador, sem else necessário
  • Um arquivo — todas as subclasses e implementações devem estar no mesmo arquivo que o tipo sealed
  • Modelagem — estados de UI, resultados de rede, navegação, sistemas de eventos
  • Segurança — adicionar nova subclasse sem tratamento em when causa erro de compilação
  • Escolha — sealed interface é preferível por padrão, sealed class quando estado compartilhado é necessário

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também