Sobes.tech
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.
  • sealed sinfning konstruktoru default tarzda private.
  • sealed sinf 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>()
    }
    
  • when ifodasida 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