Sealed Class

https://kotlinlang.org/docs/sealed-classes.html
sealed class

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

Все наследники известны на этапе компиляции. Наследование от sealed классов в разных модулях запрещено — IDE покажет ошибку.

sealed класс нельзя создать напрямую — он только предок.

Нельзя присвоить анонимному классу, так как это определяется на этапе выполнения.

Классы не могут быть open или inner.

Модификатор abstract избыточен, так как класс sealed может быть абстрактным.

Можно использовать sealed interface, если не нужно передавать параметры в конструктор.

В Java это реализовано как abstract class.

sealed class Result {
    data class Success(val data: String) : Result()
    data class Error(val exception: Exception) : Result()
    object Loading : Result()
}
sealed interface

Ограничивает реализации интерфейса, позволяя создавать закрытые иерархии типов.

sealed interface Shape

data class Circle(val radius: Double): Shape
data class Rectangle(val width: Double, val height: Double): Shape

fun area(shape: Shape): Double = when (shape) {
    is Circle -> Math.PI * shape.radius * shape.radius
    is Rectangle -> shape.width * shape.height
}
Вопросы на собесе (11)
  1. Что такое sealed class?

    Это класс с ограниченным набором подклассов. Он позволяет выражать иерархии, где возможные варианты известны на этапе компиляции. Используется для безопасного управления состоянием, например, при обработке событий в when.

  1. Что такое sealed interface?

    Интерфейс с ограниченным набором реализаций, подобный sealed class. Все реализации sealed interface должны находиться в том же файле, что и сам интерфейс, что обеспечивает контроль над наследованием и позволяет использовать when без ветки else для исчерпывающей проверки всех вариантов.

  1. Какие преимущества у использования sealed class?

    Гарантированное исчерпывающее перечисление всех возможных подклассов, что позволяет более безопасно работать с when выражениями.

    Улучшенная читаемость и контроль над иерархией классов.

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

  1. Какие ограничения наследования есть у sealed class?

    Нельзя создавать подклассы вне того файла, где он объявлен.

  1. Разница между sealed class и enum class?

    sealed class позволяет создавать иерархии с ограниченным набором подклассов и поддерживает наследование, тогда как enum class представляет фиксированный набор констант и не поддерживает наследование. Компилятор знает все значения enum class на этапе compile time. sealed class - набор значений, enum class - набор состояний. Пример применения sealed class - тип фигуры: квадрат (стороны), треугольник (углы) и круг (диаметр).

  1. Разница между sealed class и enum class с точки зрения хранения в памяти?

    enum-классы хранятся в памяти как одиночные экземпляры каждого значения, создаваемые при запуске, поскольку каждый enum — это static final объект. Это экономит память, так как каждый экземпляр создаётся только один раз. sealed-классы создают отдельные экземпляры для каждого наследника при каждом использовании, аналогично обычным классам. Поэтому их использование может потребовать больше памяти, особенно если наследники содержат свойства или создаются динамически.

  1. Разница между sealed class и abstract class?

    sealed class ограничивает наследование только подклассами, определёнными в том же файле, и используется для моделирования замкнутых иерархий типов. abstract class позволяет наследоваться без ограничений и предоставляет общие абстрактные методы для реализации в подклассах.

  1. Разница между sealed class и sealed interface?

    sealed class может иметь поля, которые доступны в его подклассах. sealed interface не может содержать поля, только методы.

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

  1. Разница между sealed interface и interface?

    sealed interface ограничивает набор классов, которые могут реализовать этот интерфейс, обеспечивая контроль над всеми реализациями на этапе компиляции. Это позволяет, например, более строго управлять обработкой различных реализаций. В то время как обычный interface не ограничивает количество классов, которые могут его реализовать, что может привести к неожиданным или неуправляемым реализациям.

  1. Как sealed class выглядит под капотом в Java?

    Как abstract class.

  1. Какие классы могут наследоваться от sealed class?

    class

    data class

    object

    data object

    inner class

    sealed class