Sobes.tech
Middle

Ի՞նչ են 'sealed' դասերը Kotlin-ում և ինչ դեպքերում պետք է օգտագործել:

sobes.tech AI

Պատասխան AI-ից

sealed դասը օգտագործվում է սահմանափակված դասերի ժառանգականությունը ներկայացնելու համար: Բոլոր ուղղակի ժառանգները sealed դասի պետք է սահմանվեն նույն ֆայլում, ինչ sealed դասը, կամ նույն մոդուլներում (Kotlin 1.5+ համար): Սա թույլ է տալիս կոմպիլյատորին ստուգել, որ բոլոր հնարավոր ենթատեսակները մշակված են when արտահայտությունում, դարձնելով այն լրիվ առանց else ճյուղի:

Հիմնական առանձնահատկություններ:

  • Բոլոր ուղղակի ենթատիպերը պետք է լինեն տեղական:
  • sealed դասի կոնստրուկտորը ըստ նախնականը private է:
  • sealed դասը չի կարող լինել աբստրակտ:
  • Չի թույլատրվում ստեղծել օրինակներ:

Օգտագործման դեպքեր:

  • Սահմանափակ վիճակների կամ արդյունքների ներկայացում: Օրինակ, 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 արտահայտությունում, ապահովելով լրիվության ստուգում:
    fun processResult(result: Result<String>) {
       when (result) {
          is Result.Success -> println("Տվյալներ ստացվեցին: ${result.data}")
          is Result.Error -> println("Սխալ: ${result.message}")
          Result.Loading -> println("Բեռնվում է...")
       }
       // `else` ճյուղի կարիք չկա, քանի որ կոմպիլյատորը գիտի բոլոր ենթատեսակները:
    }
    
  • Օգտագործում որպես enum-ների համարժեք, տվյալների ինկապսուլացիայով յուրաքանչյուր տարբերակում:

Համեմատություն enum դասերի հետ:

Գծագրություն enum class sealed class
Օրինակներ Հատուկ անունավորված կոնստանտների սահմանափակ հավաքածու Հատուկ տիպերի սահմանափակ հավաքածու
Տվյալներ տարբերակներում Չի (միայն հատկություններ) Այո (միջադասարանների միջոցով)
Աբստրակտ անդամներ Չի Այո
ժառանգություն Չի Այո, բայց միայն նույն ֆայլում/մոդուլում