Aulas seladas de Kotlin

Neste artigo, você aprenderá sobre as classes Seladas, como são criadas e quando usá-las com a ajuda de exemplos.

As classes seladas são usadas quando um valor pode ter apenas um dos tipos de um conjunto limitado (hierarquias restritas).

Antes de entrar em detalhes sobre classes seladas, vamos explorar o problema que elas resolvem. Vejamos um exemplo (retirado do site oficial do Kotlin - artigo de aulas seladas):

 class Expr class Const(val value: Int) : Expr class Sum(val left: Expr, val right: Expr) : Expr fun eval(e: Expr): Int = when (e) ( is Const -> e.value is Sum -> eval(e.right) + eval(e.left) else -> throw IllegalArgumentException("Unknown expression") )

No programa acima, a classe base Expr tem duas classes derivadas Const (representa um número) e Sum (representa a soma de duas expressões). Aqui, é obrigatório usar elsebranch para a condição padrão na expressão when.

Agora, se você derivar uma nova subclasse da Exprclasse, o compilador não detectará nada enquanto o elsebranch o manipula, o que pode levar a erros. Teria sido melhor se o compilador emitisse um erro quando adicionamos uma nova subclasse.

Para resolver este problema, você pode usar uma classe selada. Como mencionado, a classe selada restringe a possibilidade de criar subclasses. E, quando você lida com todas as subclasses de uma classe selada em uma whenexpressão, não é necessário usar elsebranch.

Para criar uma classe selada, o modificador selado é usado. Por exemplo,

 classe selada Expr

Exemplo: Classe Selada

Veja como você pode resolver o problema acima usando uma classe selada:

 sealed class Expr class Const(val value: Int) : Expr() class Sum(val left: Expr, val right: Expr) : Expr() object NotANumber : Expr() fun eval(e: Expr): Int = when (e) ( is Const -> e.value is Sum -> eval(e.right) + eval(e.left) NotANumber -> java.lang.Double.NaN ) 

Como você pode ver, não há elseramificação. Se você derivar uma nova subclasse da Exprclasse, o compilador reclamará, a menos que a subclasse seja tratada na whenexpressão.

Algumas notas importantes

  • Todas as subclasses de uma classe lacrada devem ser declaradas no mesmo arquivo em que a classe lacrada é declarada.
  • Uma classe lacrada é abstrata por si só e você não pode instanciar objetos dela.
  • Você não pode criar construtores não privados de uma classe selada; seus construtores são privatepor padrão.

Diferença entre Enum e Classe Selada

A classe Enum e a classe selada são bastante semelhantes. O conjunto de valores para um tipo de enum também é restrito como uma classe selada.

A única diferença é que enum pode ter apenas uma única instância, enquanto uma subclasse de uma classe selada pode ter várias instâncias.

Artigos interessantes...