У цій статті ви дізнаєтесь про запечатаний клас, як вони створюються та коли їх використовувати на прикладах.
Запечатані класи використовуються, коли значення може мати лише один із типів з обмеженого набору (обмежені ієрархії).
Перш ніж вдаватися до подробиць про закриті класи, давайте дослідимо, яку проблему вони вирішують. Візьмемо приклад (взято з офіційного веб-сайту Kotlin - стаття із закритими класами):
class Expr class Const(val value: Int) : Expr class Sum(val left: Expr, val right: Expr) : Expr fun eval(e: Expr): Int = when (e) ( is Const -> e.value is Sum -> eval(e.right) + eval(e.left) else -> throw IllegalArgumentException("Unknown expression") )
У наведеній вище програмі базовий клас Expr має два похідних класи Const (представляє число) і Sum (представляє суму двох виразів). Тут обов’язковим є використання else
гілки для умови за замовчуванням у виразі when.
Тепер, якщо ви отримаєте новий підклас з Expr
класу, компілятор нічого не виявить, оскільки else
гілка обробляє це, що може призвести до помилок. Було б краще, якби компілятор видав помилку, коли ми додали новий підклас.
Щоб вирішити цю проблему, ви можете використовувати герметичний клас. Як уже згадувалося, герметичний клас обмежує можливість створення підкласів. І коли ви обробляєте всі підкласи запечатаного класу у when
виразі, не потрібно використовувати else
гілку.
Для створення герметичного класу використовується герметичний модифікатор. Наприклад,
герметичний клас Вираз
Приклад: Герметичний клас
Ось як ви можете вирішити вищезазначену проблему за допомогою герметичного класу:
sealed class Expr class Const(val value: Int) : Expr() class Sum(val left: Expr, val right: Expr) : Expr() object NotANumber : Expr() fun eval(e: Expr): Int = when (e) ( is Const -> e.value is Sum -> eval(e.right) + eval(e.left) NotANumber -> java.lang.Double.NaN )
Як бачите, else
гілки немає . Якщо ви отримаєте новий підклас з Expr
класу, компілятор скаржиться, якщо підклас не оброблено у when
виразі.
Кілька важливих приміток
- Усі підкласи запечатаного класу повинні бути оголошені в тому ж файлі, де оголошено запечатаний клас.
- Герметичний клас є абстрактним сам по собі, і ви не можете створити з нього об'єкти.
- Ви не можете створювати неприватні конструктори герметичного класу; їх конструктори
private
за замовчуванням.
Різниця між Enum та Sealed Class
Клас Enum та закритий клас досить схожі. Набір значень для типу перерахування також обмежений як герметичний клас.
Єдина різниця полягає в тому, що enum може мати лише один екземпляр, тоді як підклас герметичного класу може мати кілька екземплярів.