Sealed Class — bu nima, ishlash prinsipi va qo'llanilishi

Muallif: IT Sectr Nashr etilgan: 2026-05-26 O'qish vaqti: 8 daq

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 — bir faylda e'lon qilingan belgilangan vorislar to'plamiga ega sinf.
  • Exhaustive when — kompilyator barcha ostturlar qayta ishlanganligini tekshiradi, unutilgan else bo'limlarini yo'q qiladi.
  • Sealed interface — Kotlin 1.5+ ko'p meros olish uchun muhrlangan interfeyslarni qo'llab-quvvatlaydi.
  • Xato ierarxiyasi — sealed class Kotlinda tip-xavfsiz xato boshqarishning standart usulidir.
  • Enumdan farqi — sealed classning har bir vorisi noyob holat va turli xil maydonlar soniga ega bo'lishi mumkin.

Sealed Class nima?

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.

Sealed Class va Enum: asosiy farqlar

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.

Qachon enum tanlash kerak

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.

Qachon sealed class tanlash kerak

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.

kotlin
// 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>()
}

Sealed Interface va Sealed Class

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.

Qachon sealed interface ishlatish kerak

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 classning cheklovlari

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.

kotlin
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

Mobil ishlanmada xato ierarxiyasi uchun Sealed Class

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.

Xato ierarxiyasini qanday qurish kerak

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.

Misol: autentifikatsiya xatolarini boshqarish

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.

kotlin
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"
}

Androidda Sealed Class ishlatish naqshlari

Sealed class Android ilovalari arxitekturasida standart vositaga aylandi. Mobil ishlanmada sealed class ajralmas bo'lgan uchta asosiy naqshni ko'rib chiqaylik.

  • UI State — ekranni chekli avtomat sifatida ifodalash: Loading, Content, Error. Har bir holat o'z ma'lumotlarini o'z ichiga oladi, sealed class esa barcha o'tishlar qayta ishlanganligini kafolatlaydi.
  • Navigation Event — navigatsiya konstantalari o'rniga sealed class: har bir ekran marshrut parametrlari bilan alohida vorisdir. Kompilyator argument turlarini tekshiradi.
  • Action/Intent — Unidirectional Data Flow naqshi foydalanuvchi ekranda bajarishi mumkin bo'lgan barcha harakatlarni ifodalash uchun sealed classdan foydalanadi.

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.

Sealed class ierarxiyalarini test qilish

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.

Sealed Class bilan ishlashda odatiy xatolar

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.

  • Turli fayllardagi vorislar — kompilyator sealed classni e'lon qilishga ruxsat bermaydi, agar vorislar fayldan tashqarida bo'lsa. Bu cheklov to'liq whenni kafolatlaydi.
  • Sealed va openni aralashtirish — sealed class bir vaqtning o'zida open bo'lishi mumkin emas. Kengaytiriladigan ierarxiya kerak bo'lsa, oddiy abstract classdan foydalaning, lekin to'liqlikdan voz kechasiz.
  • Haddan tashqari joylashish — sealed class ichida sealed class chuqur ierarxiya yaratadi, uni saqlash qiyin. Oddiy stsenariylar uchun ikki daraja yetarli.
  • When da unutilgan else — agar kutubxonadagi sealed class to'liqlikka ega bo'lmasa, kompilyator o'tkazib yuborilgan bo'lim haqida ogohlantirmaydi. Else ni faqat ongli ravishda qo'shing.

Ko'p beriladigan savollar

Sealed class mavhum metodlarga ega bo'lishi mumkinmi?

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.

Sealed class Java da mavjudmi?

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.

Sealed class boshqa sealed classdan meros olishi mumkinmi?

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 unumdorlikka ta'sir qiladimi?

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 class ierarxiyalarini qanday test qilish kerak?

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

  • Sealed class — bir faylda e'lon qilingan belgilangan vorislar to'plamiga ega sinf, bu kompilyatsiya bosqichida to'liq when tahlilini beradi.
  • Sealed classning har bir vorisi o'z ma'lumotlar tuzilishiga ega bo'lishi mumkin — bu enumdan asosiy farq, u erda barcha variantlar bir tipdagi konstantalardir.
  • Sealed interface (Kotlin 1.5+) ko'p meros olishni qo'llab-quvvatlaydi, sealed class — faqat yagona meros. Tanlov umumiy holatga ehtiyojga bog'liq.
  • Sealed class — Kotlinda tip-xavfsiz xato ierarxiyasi uchun standart mexanizm: har bir nosozlik turi tegishli maydonlarga ega alohida vorisdir.
  • Androiddagi asosiy naqshlar: UI State, Navigation Event va Action/Intent — qayta ishlash to'liqligini kafolatlash uchun sealed class asosida qurilgan.
  • Turli fayllardagi vorislardan, haddan tashqari joylashishdan va sealed bilan openni aralashtirishdan saqlaning — bu chekli ierarxiya shartnomasini buzadi.

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.

Loyihani muhokama qilish

Shuningdek o'qing