Sealed Class — Kotlin tilida meros ierarxiyasini belgilangan ostturlar to'plami bilan cheklaydigan maxsus sinf turi. Barcha vorislar bir faylda e'lon qilinadi va kompilyatorga ma'lum bo'ladi, bu esa majburiy else bo'limisiz to'liq when blokidan foydalanish imkonini beradi. Kotlin Docs, 2026 ma'lumotlariga ko'ra, muhrlangan sinflar — holatlar, xato turlari va UI hodisalari kabi cheklangan ierarxiyalarni ifodalash uchun asosiy mexanizmdir.
Asosiy ma'lumotlar
Sealed Class (muhrlangan sinf) — Kotlin tilida sealed modifikatori bilan belgilangan sinf. U cheklangan tip ierarxiyasini belgilaydi: barcha mumkin bo'lgan vorislar bir faylda sanab o'tilgan va kompilyator ularning har biri haqida biladi. Bu sealed classni oddiy ochiq sinfdan farqlaydi, uning vorislari istalgan joyda e'lon qilinishi mumkin.
Sealed classning asosiy maqsadi — cheklangan variantlar to'plamining tip-xavfsiz ifodasi. Har bir voris o'z ma'lumotlar tuzilishiga ega bo'lishi mumkin, bu sealed classni enumdan moslashuvchanroq qiladi. Ish vaqtida sealed class oddiy mavhum sinfdir, kompilyator cheklovlarni faqat kompilyatsiya bosqichida qo'llaydi.
Sealed class ayniqsa Android arxitekturasida foydali: UI holatlari, tarmoq so'rovlari natijalari, Intentga o'xshash navigatsiya hodisalari va, albatta, xato ierarxiyalari — odatiy qo'llanish stsenariylari.
Kompilyatsiya paytida sealed class when ifodalari uchun o'tish jadvaliga optimallashtiriladi, bu uni if-else zanjirlaridan samaraliroq qiladi. Data class bilan birgalikda har bir voris nafaqat holatni, balki metodlarni ham o'z ichiga olishi mumkin, bu esa boilerplate kodsiz o'zini-o'zi hujjatlashtiruvchi domen modellarini yaratishga imkon beradi.
Sealed class shuningdek mobil ilovalarda chekli avtomatlarni (state machine) ifodalash uchun samaralidir. Har bir holat — noyob parametrlarga ega alohida voris, holatlar orasidagi o'tishlar esa when ifodasi orqali boshqariladi. Kompilyator barcha mumkin bo'lgan holatlar qayta ishlanganligini kafolatlaydi, bu esa UI holati yoki biznes mantig'i o'zgarishida ish vaqti xatolarini yo'q qiladi.
Boshlang'ich Kotlin dasturchilari ko'pincha sealed classni enum bilan aralashtiradilar, chunki ikkalasi ham qiymatlar to'plamini cheklaydi. Biroq ular o'rtasida tub farq bor: enum — bir tipdagi konstantalar to'plami, sealed class — har xil tiplarning ierarxiyasi.
Enum barcha variantlar qo'shimcha tuzilishga ega bo'lmagan konstantalar bo'lganda optimaldir. Masalan, hafta kunlari, buyurtma holatlari yoki parametrsiz harakat turlari. Har bir enum qiymati belgilangan nomga ega singletondir.
Sealed class har bir variant o'z ma'lumotlariga ega bo'lganda kerak. Masalan, tarmoq xatosi javob kodini, tahlil xatosi — tafsilotlarni, avtorizatsiya xatosi esa — xabarni o'z ichiga oladi. Sealed classning har bir vorisi noyob maydonlarga ega alohida tipdir.
// Enum — bir tipdagi barcha variantlar
enum class Status { LOADING, SUCCESS, ERROR }
// Sealed class — har bir variant o'z ma'lumotlari bilan
sealed class UiState<out T> {
object Loading : UiState<Nothing>()
data class Success<T>(val data: T) : UiState<T>()
data class Error(val message: String) : UiState<Nothing>()
}
Kotlin 1.5 dan boshlab sealed interface e'lon qilish imkoniyati paydo bo'ldi. Bu sealed kontseptsiyasini interfeyslarga kengaytiradi: sealed interface ham belgilangan amalga oshirishlar to'plamiga ega, lekin ko'p meros olishni qo'llab-quvvatlaydi.
Sealed interface vorislar bir vaqtning o'zida bir nechta shartnomalarni amalga oshirishi kerak bo'lganda qulaydir. Masalan, UI hodisasi bir vaqtning o'zida bosiladigan va kuzatiladigan bo'lishi mumkin. Sealed class bilan bitta asosiy sinfni tanlash kerak bo'ladi, sealed interface bilan voris ikkalasini ham amalga oshiradi.
Sealed class sinf bo'lgani uchun har bir voris faqat bitta ota-onaga ega bo'lishi mumkin. Sealed interface bu muammoni hal qiladi, lekin holatni saqlay olmaydi. Ularning o'rtasidagi tanlov vazifaga bog'liq: maydonlar bilan umumiy mantiq kerak — sealed class, shartnomalarning moslashuvchanligi kerak — sealed interface.
sealed interface ScreenEvent {
data class Refresh(val force: Boolean) : ScreenEvent
data class Navigate(val route: String) : ScreenEvent
data class ShowError(val toast: String) : ScreenEvent
}
sealed interface AnalyticsEvent {
val name: String
val params: Map<String, Any>
}
// Voris ikkala interfeysni amalga oshiradi
data class LoginClicked(
override val name: String = "login_click",
override val params: Map<String, Any> = emptyMap()
) : ScreenEvent, AnalyticsEvent
Sealed classning mobil ishlanmadagi asosiy qo'llanilishlaridan biri — tip-xavfsiz xato ierarxiyasi. Har xil turdagi istisnolarni tashlash yoki umumiy Exception-dan foydalanish o'rniga, sealed class barcha mumkin bo'lgan domen xatolarini bir tipda to'playdi.
DomainError sealed classini yarating va barcha nosozlik turlarini voris sifatida sanab o'ting. Har bir voris faqat ma'lum bir xato turi uchun ma'noga ega bo'lgan ma'lumotlarni o'z ichiga oladi. Kompilyator xatoni qayta ishlashda hech qanday variantni unutmasligingizni kafolatlaydi.
Avtorizatsiyaga ega ilovani ko'rib chiqaylik, unda turli xil nosozlik stsenariylari mumkin: noto'g'ri parol, hisobning bloklanishi, server muammosi. Sealed class ularni to'liq boshqarish bilan yagona tipda birlashtiradi.
sealed class AuthError {
data class InvalidCredentials(
val attempts: Int
) : AuthError()
data class AccountBlocked(
val until: Long
) : AuthError()
data class NetworkFailure(
val cause: Throwable
) : AuthError()
object ServerError : AuthError()
}
fun handleError(error: AuthError): String = when (error) {
is AuthError.InvalidCredentials ->
"Qolgan urinishlar: ${3 - error.attempts}"
is AuthError.AccountBlocked ->
"Kirish ${Date(error.until)} gacha bloklangan"
is AuthError.NetworkFailure ->
"Ulanishni tekshiring: ${error.cause.localizedMessage}"
AuthError.ServerError ->
"Server vaqtincha mavjud emas"
}
Sealed class Android ilovalari arxitekturasida standart vositaga aylandi. Mobil ishlanmada sealed class ajralmas bo'lgan uchta asosiy naqshni ko'rib chiqaylik.
Alohida ta'kidlash joizki, sealed class Clean Architecture da qo'llaniladi. Har bir qatlam (data, domain, presentation) o'z xato turlari uchun sealed classdan foydalanadi, maperlar esa bir sealed classni boshqasiga o'zgartiradi. Masalan, Data qatlamidagi DataError biznes mantig'i uchun DomainError ga, so'ngra presentation qatlami uchun UiState ga o'zgartiriladi. Bu ilovaning barcha darajalarida tip xavfsizligini saqlaydi va hech qanday xato qayta ishlanmagan holda qolmasligini kafolatlaydi.
Test qilish sealed class alohida yondashuvni talab qiladi, chunki har bir voris o'z holatiga ega alohida tipdir. Sealed classning barcha vorislaridan o'tadigan parametrlashgan testlarni yozish tavsiya etiladi. Bu when ifodalarining ierarxiya kengaytirilganda qo'shilgan yangilarni ham o'z ichiga olgan holda barcha variantlarni qamrab olishini kafolatlaydi.
UI testlari uchun sealed class UiState sifatida har bir holatning ko'rinishini tekshirishga imkon beradi: Loading spinnerni, Content — ma'lumotlarni, Error — xato xabarini ko'rsatadi. Sealed class chekli bo'lgani uchun barcha holatlarning test qamrovi UI mantig'ining to'g'riligiga to'liq ishonch beradi.
Kontseptsiyaning soddaligiga qaramay, dasturchilar sealed class ierarxiyalarini loyihalashda muntazam ravishda xatolarga yo'l qo'yadilar. Asosiy muammolar va ulardan qochish yo'llarini ko'rib chiqaylik.
Ko'p beriladigan savollar
Ha, sealed class mavhum metodlarni o'z ichiga olishi mumkin va har bir voris ularni amalga oshirishi shart. Bu barcha variantlar yagona interfeysni taqdim etishi kerak bo'lgan, ammo turli bajarish mantig'iga ega bo'lgan hollarda qulaydir.
Java 17+ da sealed modifikatori bilan muhrlangan sinflar va interfeyslar paydo bo'ldi. Android hozirda Java 17 ni qisman qo'llab-quvvatlaydi, ammo Kotlin loyihalarida sealed class Kotlin 1.0 dan boshlab cheklovlarsiz mavjud.
Ha, bir sealed class boshqasining vorisi bo'lishi mumkin. Sealed class ierarxiyasi chekli qoladi: kompilyator har bir darajadagi barcha vorislarni biladi. Bu batafsil xato tasniflarini yaratishga imkon beradi.
Sealed class ish vaqtida qo'shimcha yuk yaratmaydi. Kompilyator sealed class bilan when ifodalarini o'tish jadvallariga (tableswitch) optimallashtiradi, bu if-else zanjirlaridan tezroqdir. Unumdorlik enum bilan bir xil.
Sealed classning har bir vorisi alohida test qilinadi. Sealed class chekli bo'lgani uchun barcha variantlardan o'tadigan parametrlashgan test yozish mumkin. Bu when bloklari shoxlarining to'liq qamrovini ta'minlaydi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.