Sobes.tech
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 when sem necessidade de else.
  • 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).