Sobes.tech
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 é private por padrão.
  • A classe sealed nã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 when com 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