Middle
Kotlin'da 'sealed' sinflar nima va qachon ishlatilishi kerak?
sobes.tech AI
AIdan javob
sealed sinfi sinf yoki cheklangan sinf hierarxiyasini tasvirlash uchun ishlatiladi. sealed sinfning barcha to'g'ridan-to'g'ri vorislari bir xil faylda yoki (Kotlin 1.5+ uchun) bir xil modullarda aniqlanishi kerak. Bu kompilatorga when ifodasida barcha mumkin bo'lgan vorislar bilan ishlashni tekshirish imkonini beradi, uni else bo'lagi bo'lmasdan to'ldirilgan qiladi.
Asosiy xususiyatlar:
- Barcha to'g'ridan-to'g'ri vorislar lokal bo'lishi kerak.
sealedsinfning konstruktoru default tarzdaprivate.sealedsinf abstrakt bo'lishi mumkin emas.- Ob'ektlar yaratishga ruxsat bermaydi.
Foydalanish holatlari:
- Cheklangan holatlar yoki natijalar to'plamini ifodalash. Masalan,
Loading,Success(data),Error(message).sealed class Result<out T> { data class Success<T>(val data: T) : Result<T>() data class Error(val message: String) : Result<Nothing>() object Loading : Result<Nothing>() } whenifodasida to'liq tekshirish bilan variantlarni ishlash.fun processResult(result: Result<String>) { when (result) { is Result.Success -> println("Olingan ma'lumotlar: ${result.data}") is Result.Error -> println("Xato: ${result.message}") Result.Loading -> println("Yuklanmoqda...") } // `else` bo'lagi kerak emas, chunki kompilator barcha vorislarni biladi. }- Har bir variantda ma'lumotlarni inkapsulyatsiya qilish imkoniyatini beradigan enumlarning ekvivalent sifatida foydalanish.
Enum klasslar bilan taqqoslash:
| Xususiyat | enum class |
sealed class |
|---|---|---|
| Namuna | Cheklangan nomlangan konstantalar to'plami | Cheklangan turlar to'plami |
| Variantlardagi ma'lumotlar | Yo'q (faqat xususiyatlar) | Ha (subklasslar orqali) |
| Abstrakt a'zolar | Yo'q | Ha |
| Meros olish | Yo'q | Ha, lekin faqat bir xil fayl/modulda |