Kotlin-da sealed class va interface — bu nima, sintaksis va qo'llash

Muallif: IT Sectr Nashr etilgan: 2026-06-20 O'qish vaqti: 11 daq

sealed class va sealed interface Kotlin-da cheklangan tur ierarxiyasi mexanizmlari bo'lib, bunda barcha mumkin bo'lgan pastki sinflar kompilyatsiya bosqichida ma'lum bo'ladi. Oddiy abstrakt sinflardan farqli o'laroq, sealed class when ifodasida barcha variantlarni to'liq qayta ishlashni kafolatlaydi. JetBrains Kotlin Language Guide (2026) hujjatiga ko'ra, sealed turlar Kotlin loyihalarida holatlar, UI ekranlari va natija turlarini modellashtirish uchun asos hisoblanadi.

Asosiy ma'lumotlar

  • sealed — barcha pastki sinflar kompilyatsiya bosqichida ma'lum bo'lgan cheklangan ierarxiya
  • when — majburiy else blokisiz barcha pastki sinflarni to'liq qayta ishlash
  • sealed interface — meros olish cheklovlarisiz moslashuvchan ierarxiyalar uchun Kotlin 1.5 da qo'shilgan
  • Kompilyatsiya — sealed turlar uchun to'liq bo'lmagan when da kompilyatsiya xatosi
  • Ierarxiya — barcha pastki sinflar bir faylda yoki sealed sinf ichida bo'lishi kerak

Sealed class va sealed interface nima?

sealed class cheklovga ega abstrakt sinfdir: uning barcha to'g'ridan-to'g'ri pastki sinflari sealed class bilan bir faylda e'lon qilinishi kerak. Bu cheklov ierarxiyani yopiq (sealed) qiladi — fayldan tashqaridagi hech qanday kod yangi pastki sinf qo'sha olmaydi.

sealed interface, Kotlin 1.5 da qo'shilgan, interfeys moslashuvchanligi bilan bir xil kafolatni taqdim etadi: sealed interface bir faylda bir nechta sinflar, ob'ektlar yoki boshqa interfeyslar tomonidan amalga oshirilishi mumkin. Sealed class dan farqli o'laroq, sealed interface yagona meros olish chekloviga ega emas — sinf bir vaqtning o'zida bir nechta sealed interfeyslarni amalga oshirishi mumkin.

Kotlin Evolution and Roadmap (2026) ma'lumotlariga ko'ra, sealed interface yanada moslashuvchan modellashtirish uchun jamiyat talabi bilan qo'shilgan. Asosiy motivatsiya — sinflarning ko'p merosisiz mustaqil tur ierarxiyalarini birlashtirish imkoniyati edi.

Sealed class sintaksisi

Sealed class e'loni class oldidan sealed kalit so'zi bilan boshlanadi. Pastki sinflar bir faylda e'lon qilinadi.

kotlin
sealed class NetworkResult {
    data class Success(val data: String) : NetworkResult()
    data class Error(val message: String) : NetworkResult()
    object Loading : NetworkResult()
}

Har bir sealed class pastki sinfi o'z xususiyatlari va metodlariga ega bo'lishi mumkin. Loading singleton (object), Success va Error esa parametrlarga ega data class. Kompilyator uchala variantni ham biladi va when da foydalanishda ularning to'liqligini tekshiradi.

Ichma-ich sealed class

sealed sinflar tur xavfsizligini yo'qotmagan holda murakkab ma'lumot modellari uchun ko'p darajali ierarxiyalar yaratib, ichma-ich joylashishi mumkin.

kotlin
sealed class UiState {
    object Idle : UiState()
    object Loading : UiState()
    data class Content(val items: List<Item>) : UiState()
    data class Error(val exception: Throwable) : UiState()
}

Sealed interface sintaksisi (Kotlin 1.5+)

sealed interface sealed class kabi e'lon qilinadi, lekin bir sinfda bir nechta sealed interfeyslarni amalga oshirishga imkon beradi.

kotlin
sealed interface Action
sealed interface Loggable

data class Navigate(val route: String) : Action, Loggable
data class ShowToast(val text: String) : Action
object GoBack : Action, Loggable

Navigate sinfi bir vaqtning o'zida ikkita sealed interfeysni — Action va Loggable ni amalga oshiradi. Sealed class uchun bu yagona meros cheklovi tufayli mumkin emas. sealed interface mustaqil ierarxiyalarni birlashtirish moslashuvchanligini beradi.

Qachon sealed interface ni sealed class dan afzal ko'rish kerak

sealed interface ierarxiya umumiy holat yoki konstruktorni talab qilmasa afzalroqdir. JetBrains Kotlin Guidelines (2026) ga ko'ra, umumiy konstruktor kerak bo'lmagan barcha yangi ierarxiyalar uchun sukut bo'yicha sealed interface ishlatilishi kerak, bu kodni kelajakdagi kengaytmalar uchun yanada moslashuvchan qiladi.

When da to'liq qayta ishlash

Sealed turlarning asosiy afzalligi when ifodasida to'liq (exhaustive) qayta ishlashdir. Kompilyator barcha mumkin bo'lgan pastki sinflar hisobga olinganligini tekshiradi.

kotlin
fun handleResult(result: NetworkResult): String = when (result) {
    is NetworkResult.Success -> "Data: ${result.data}"
    is NetworkResult.Error -> "Error: ${result.message}"
    is NetworkResult.Loading -> "Loading..."
    // else talab qilinmaydi — kompilyator barcha variantlar qamrab olinganligini biladi
}

Agar dasturchi sealed ierarxiyasiga yangi pastki sinf qo'shsa, lekin uni when da qayta ishlashni unutsa — kompilyator xato beradi. Bu else tarmog'iga ega ochiq ierarxiyalarda mavjud bo'lmagan tur darajasidagi xavfsizlikdir.

Google Android Developers (2026) ma'lumotlariga ko'ra, sealed sinflar Jetpack Compose da UI holatini modellashtirish uchun tavsiya etilgan usuldir. When ni to'liq tekshirish dasturchi ekranni ko'rsatishning barcha mumkin bo'lgan variantlarini qayta ishlamagan holatlarning oldini oladi.

Sealed class bilan enum class solishtirish

enum class va sealed class ko'pincha aralashtiriladi, lekin ularning turli maqsadlari va imkoniyatlari bor.

Xususiyatsealed classenum class
NamunalarBir nechta (data class), bitta (object)Har bir konstanta uchun aynan bitta
XususiyatlarHar bir pastki sinf uchun farqliBarcha konstantalar uchun bir xil
MerosHa (sealed class dan)Yo'q (implicit final)
KonstruktorParametrlarga ega bo'lishi mumkinFaqat barcha konstantalar uchun umumiy
IerarxiyaCheklangan, sealedRuxsat etilgan konstantalar to'plami

Tanlov sealed class va enum class o'rtasida vazifaga bog'liq. Agar variantlar qo'shimcha ma'lumotlarni olib yurmasa — enum dan foydalaning. Agar har bir variant noyob maydonlarni o'z ichiga olsa — sealed class yoki sealed interface dan foydalaning.

Amaliy qo'llash ssenariylari

Sealed turlar Kotlin loyihalarida tur xavfsiz modellashtirishni talab qiladigan bir qator standart ssenariylar uchun ishlatiladi.

Jetpack Compose da UI holati

Har bir Compose ekrani barcha mumkin bo'lgan holatlarni tavsiflovchi sealed class UiState ga ega bo'lishi mumkin: Idle, Loading, Content(data), Error(exception). when ifodasi barcha holatlar qayta ishlanganligini kafolatlaydi.

Tarmoq so'rovlari natijasi

NetworkResult Success, Error, Loading variantlari bilan Retrofit va Ktor bilan Kotlin loyihalarida standart naqshdir. sealed class so'rovning har bir natijasini xavfsiz qayta ishlashni ta'minlaydi.

Multi-modul loyihalarida navigatsiya

sealed interface navigatsiya marshrutlari uchun modullarga yagona ierarxiya doirasida o'z marshrutlarini e'lon qilish imkonini beradi. Bu kompilyatsiya bosqichida noma'lum marshrutlar bilan bog'liq xatolarni bartaraf qiladi.

KotlinConf (2025) ma'lumotlariga ko'ra, sealed class va sealed interface zamonaviy Kotlin ilovalarida type-safe dizaynning asosidir. Ular kompilyatsiya bosqichida xavfsizlikni yo'qotmagan holda murakkab domen tuzilmalarini modellashtirish uchun data class bilan birlashtiriladi.

Tez-tez beriladigan savollar

Sealed class pastki sinflari qayerda e'lon qilinishi kerak?

Barcha to'g'ridan-to'g'ri sealed class pastki sinflari bir faylda e'lon qilinishi kerak. Sealed interface uchun ham xuddi shunday qoida — amalga oshirishlar bir faylda.

Sealed interface boshqa faylda amalga oshirilishi mumkinmi?

Yo'q, bitta fayl qoidasi sealed interface uchun ham amal qiladi. Barcha amalga oshirishlar sealed interface e'lon qilingan faylda bo'lishi kerak.

Sealed class va sealed interface o'rtasidagi farq nima?

sealed interface holat va konstruktorga ega emas, bir nechta amalga oshirishga imkon beradi. sealed class konstruktor va umumiy holatga ega bo'lishi mumkin, lekin sinf faqat bitta sealed class dan meros olishi mumkin.

Sealed sinflar when ifodalarida qanday yordam beradi?

Kompilyator when to'liqligini tekshiradi: agar barcha pastki sinflar qayta ishlanmagan bo'lsa, kod kompilyatsiya qilinmaydi. Bu runtime xatolarini bartaraf qiladi va kodni xavfsizroq qiladi.

Konstruktor bilan sealed class yaratish mumkinmi?

Ha, sealed class konstruktorga ega bo'lishi mumkin (sukut bo'yicha private). Barcha pastki sinflar super() orqali ushbu konstruktorga parametrlarni uzatishi mumkin.

Xulosa

  • sealed class — pastki sinflari kompilyatsiya bosqichida ma'lum bo'lgan cheklangan ierarxiya
  • sealed interface — bir nechta amalga oshirishni qo'llab-quvvatlovchi moslashuvchan alternativ (Kotlin 1.5+)
  • when — kompilyator tekshiruvi bilan to'liq qayta ishlash, else talab qilinmaydi
  • Bitta fayl — barcha pastki sinflar va amalga oshirishlar sealed tur bilan bir faylda bo'lishi kerak
  • Modellashtirish — UI holatlari, tarmoq natijalari, navigatsiya, hodisa tizimlari
  • Xavfsizlik — when da qayta ishlanmagan holda yangi pastki sinf qo'shish kompilyatsiya xatosiga sabab bo'ladi
  • Tanlov — sukut bo'yicha sealed interface afzal, umumiy holat kerak bo'lganda sealed class

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