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 else
branch para a condição padrão na expressão when.
Agora, se você derivar uma nova subclasse da Expr
classe, o compilador não detectará nada enquanto o else
branch 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 when
expressão, não é necessário usar else
branch.
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á else
ramificação. Se você derivar uma nova subclasse da Expr
classe, o compilador reclamará, a menos que a subclasse seja tratada na when
expressã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
private
por 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.