English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Neste artigo, você aprenderá com a ajuda de exemplos sobre as classes Seladas (Seladas), como criá-las e quando usá-las.
Quando o valor pode conter apenas um tipo de conjunto limitado (estrutura hierárquica restrita), será usado classes seladas.
Antes de detalhar as classes seladas, vamos explorar os problemas que elas resolvem. Vamos dar um exemplo:
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("Expressão desconhecida") }
No programa acima, a classe base Expr tem dois subclasses Const (representando um número) e Sum (representando a soma de expressões). Aqui, é necessário usar a ramificação else para lidar com expressão whencondição padrão.
Agora, se você derivar uma nova subclasse da classe Expr, o compilador não detectará nada, pois a ramificação else se ocupará disso, o que pode levar a erros. Se o compilador emitir um erro ao adicionar novas subclasses, isso seria melhor.
Para resolver esse problema, você pode usar classes seladas. Como mencionado anteriormente, as classes seladas limitam a possibilidade de criação de subclasses. Além disso, ao lidar com todas as subclasses de classes seladas em expressões when, você não precisa usar a ramificação else.
Para criar classes seladas, use o modificador selado sealed. Por exemplo,
sealed class Expr
Este é o método de solução do problema mencionado usando classes seladas:
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á ramo else. Se você derivar uma nova subclass do tipo Expr, a menos que a subclass seja tratada na expressão when, o compilador reportará.
Todas as subclasses de classes encerradas devem ser declaradas no mesmo arquivo onde a classe encerrada é declarada.
A classe encerrada em si éAbstraçãoVocê não pode instanciar objetos a partir deles.
Não é possível criar construtores não privados para classes encerradas; por padrão, seus construtores são privados.
Classe EnumeradaMuito semelhante às classes encerradas. O conjunto de valores do tipo enum também é limitado como as classes encerradas.
A única diferença é que os enums podem ter apenas um único exemplo, enquanto as subclasses de classes encerradas podem ter múltiplos exemplos.