Ключевое слово sealed

Ключевое слово sealed используется для объявления запечатанных классов, которые представляют ограниченный набор возможных подклассов. Все подклассы запечатанного класса должны быть объявлены в том же файле, что и сам запечатанный класс. Это позволяет компилятору знать все возможные типы наследников и обеспечивать безопасность при использовании when-выражений.

Синтаксис

kotlinsealed class ClassName {
  // объявление подклассов
}

Пример

Создадим запечатанный класс Result с двумя подклассами:

kotlinsealed 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)
}

Результат выполнения кода:

kotlinString "data loaded"

Пример

Запечатанные классы могут содержать данные и методы:

kotlinsealed 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())

Результат выполнения кода:

kotlinDouble 78.53981633974483

Пример

Запечатанные классы могут использоваться с объектами:

kotlinsealed 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}")
}

Результат выполнения кода:

kotlinString "loading"

Пример

Запечатанные интерфейсы также поддерживаются:

kotlinsealed 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))

Результат выполнения кода:

kotlinDouble 5.0

Смотрите также

  • ключевое слово class,
    которое объявляет обычные классы
  • ключевое слово abstract,
    которое объявляет абстрактные классы
  • ключевое слово enum,
    которое объявляет перечисления
  • ключевое слово interface,
    которое объявляет интерфейсы