У овом чланку ћете научити о запечаћеним часовима, како се стварају и када их треба користити уз помоћ примера.
Запечаћене класе се користе када вредност може имати само један од типова из ограниченог скупа (ограничене хијерархије).
Пре него што улазимо у детаље о запечаћеним часовима, истражимо који проблем они решавају. Узмимо пример (преузето са званичне веб странице Котлин - чланак о запечаћеним часовима):
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") )
У горњем програму основна класа Екпр има две изведене класе Цонст (представља број) и Сум (представља збир два израза). Овде је обавезно користити else
грану за подразумевани услов у изразу вхен.
Сада, ако из 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
подразумевано.
Разлика између енума и запечаћене класе
Класа Енум и затворена класа су прилично сличне. Скуп вредности за тип набрајања такође је ограничен попут запечаћене класе.
Једина разлика је у томе што енум може имати само једну инстанцу, док подкласа запечаћене класе може имати више инстанци.