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)
- Что такое sealed class?
Это класс с ограниченным набором подклассов. Он позволяет выражать иерархии, где возможные варианты известны на этапе компиляции. Используется для безопасного управления состоянием, например, при обработке событий в
when
.
- Что такое sealed interface?
Интерфейс с ограниченным набором реализаций, подобный
sealed class
. Все реализацииsealed interface
должны находиться в том же файле, что и сам интерфейс, что обеспечивает контроль над наследованием и позволяет использоватьwhen
без ветки else для исчерпывающей проверки всех вариантов.
- Какие преимущества у использования sealed class?
• Гарантированное исчерпывающее перечисление всех возможных подклассов, что позволяет более безопасно работать с
when
выражениями.• Улучшенная читаемость и контроль над иерархией классов.
• Ограничение наследования, что делает код более предсказуемым и поддерживаемым.
- Какие ограничения наследования есть у sealed class?
Нельзя создавать подклассы вне того файла, где он объявлен.
- Разница между sealed class и enum class?
sealed class
позволяет создавать иерархии с ограниченным набором подклассов и поддерживает наследование, тогда какenum class
представляет фиксированный набор констант и не поддерживает наследование. Компилятор знает все значенияenum class
на этапе compile time.sealed class
- набор значений,enum class
- набор состояний. Пример примененияsealed class
- тип фигуры: квадрат (стороны), треугольник (углы) и круг (диаметр).
- Разница между sealed class и enum class с точки зрения хранения в памяти?
enum
-классы хранятся в памяти как одиночные экземпляры каждого значения, создаваемые при запуске, поскольку каждыйenum
— этоstatic final
объект. Это экономит память, так как каждый экземпляр создаётся только один раз.sealed
-классы создают отдельные экземпляры для каждого наследника при каждом использовании, аналогично обычным классам. Поэтому их использование может потребовать больше памяти, особенно если наследники содержат свойства или создаются динамически.
- Разница между sealed class и abstract class?
sealed class
ограничивает наследование только подклассами, определёнными в том же файле, и используется для моделирования замкнутых иерархий типов.abstract class
позволяет наследоваться без ограничений и предоставляет общие абстрактные методы для реализации в подклассах.
- Разница между sealed class и sealed interface?
sealed class
может иметь поля, которые доступны в его подклассах.sealed interface
не может содержать поля, только методы.sealed interface
может быть более гибким в некоторых случаях, позволяя интерфейсам определять ограничения, которые могут быть реализованы различными классами, тогда как sealed class имеет более строгую иерархию.
- Разница между sealed interface и interface?
sealed interface
ограничивает набор классов, которые могут реализовать этот интерфейс, обеспечивая контроль над всеми реализациями на этапе компиляции. Это позволяет, например, более строго управлять обработкой различных реализаций. В то время как обычный interface не ограничивает количество классов, которые могут его реализовать, что может привести к неожиданным или неуправляемым реализациям.
- Как sealed class выглядит под капотом в Java?
Как
abstract class
.
- Какие классы могут наследоваться от sealed class?
•
class
•
data class
•
object
•
data object
•
inner class
•
sealed class