Spec-Zone.ru › Kotlin 1.4

Закрытые классы

Закрытые классы используются для представления ограниченных иерархий классов, когда значение может иметь один из типов из ограниченного набора, но не может иметь какой-либо другой тип. В некотором смысле они являются расширением перечислений: набор значений для типа перечисления также ограничен, но каждая константа перечисления существует только как отдельная сущность, тогда как подкласс закрытого класса может иметь несколько экземпляров, которые могут содержать состояние.

Чтобы объявить закрытый класс, необходимо поместить модификатор sealed перед именем класса. Закрытый класс может иметь подклассы, но все они должны быть объявлены в том же файле, что и сам закрытый класс. (До Kotlin 1.1 правила были еще строже: классы должны были быть вложены внутри объявления закрытого класса).

sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()

(В примере выше используется одна дополнительная новая функция Kotlin 1.1: возможность для данных классов расширять другие классы, включая закрытые классы.)

Сам по себе закрытый класс является абстрактным, его нельзя создать напрямую, и он может иметь абстрактные члены.

Закрытые классы не могут иметь конструкторов, отличных от private (их конструкторы по умолчанию private).

Обратите внимание, что классы, которые расширяют подклассы закрытого класса (косвенные наследники), могут располагаться где угодно, а не обязательно в том же файле.

Ключевое преимущество использования закрытых классов проявляется при использовании их в when выражении. Если можно проверить, что оператор охватывает все случаи, вам не нужно добавлять else предложение в оператор. Однако это работает только если вы используете when как выражение (используя результат), а не как оператор.

fun eval(expr: Expr): Double = when(expr) {
    is Const -> expr.number
    is Sum -> eval(expr.e1) + eval(expr.e2)
    NotANumber -> Double.NaN
    // the `else` clause is not required because we've covered all the cases
}

© 2010–2020 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/reference/sealed-classes.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API