АКЦИЯ: бесплатные месячные курсы по созданию сайтов
на выбор: верстка, JavaScript, PHP, Python или фреймворки. Сегодня последний день для записи! Жми!
1249 of 1310 menu
Вступайте в телеграмм-канал сайта code.mu: новинки, статьи, интервью, задачи, бесплатные курсы и тренинги. Жми для вступления:)

Ключевое слово 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

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

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