Ключевое слово sealed
Ключевое слово sealed
используется для объявления запечатанных классов,
которые представляют ограниченный набор возможных подклассов.
Все подклассы запечатанного класса должны быть объявлены в том же файле,
что и сам запечатанный класс. Это позволяет компилятору знать все возможные
типы наследников и обеспечивать безопасность при использовании when-выражений.
Синтаксис
sealed class ClassName {
// объявление подклассов
}
Пример
Создадим запечатанный класс Result
с двумя подклассами:
sealed class Result {
class Success(val data: String) : Result()
class Error(val message: String) : Result()
}
val result: Result = Result.Success("data loaded")
when (result) {
is Result.Success -> println(result.data)
is Result.Error -> println(result.message)
}
Результат выполнения кода:
String "data loaded"
Пример
Запечатанные классы могут содержать данные и методы:
sealed class Shape {
class Circle(val radius: Double) : Shape()
class Rectangle(val width: Double, val height: Double) : Shape()
fun area(): Double = when (this) {
is Circle -> Math.PI * radius * radius
is Rectangle -> width * height
}
}
val circle: Shape = Shape.Circle(5.0)
println(circle.area())
Результат выполнения кода:
Double 78.53981633974483
Пример
Запечатанные классы могут использоваться с объектами:
sealed class State {
object Loading : State()
object Ready : State()
class Error(val code: Int) : State()
}
val currentState: State = State.Loading
when (currentState) {
State.Loading -> println("loading")
State.Ready -> println("ready")
is State.Error -> println("error: ${currentState.code}")
}
Результат выполнения кода:
String "loading"
Пример
Запечатанные интерфейсы также поддерживаются:
sealed interface Expr
class Const(val number: Double) : Expr
class Sum(val e1: Expr, val e2: Expr) : Expr
fun eval(expr: Expr): Double = when (expr) {
is Const -> expr.number
is Sum -> eval(expr.e1) + eval(expr.e2)
}
val expression: Expr = Sum(Const(2.0), Const(3.0))
println(eval(expression))
Результат выполнения кода:
Double 5.0