Sobes.tech
Middle

Kotlinдеги 'sealed' класстары эмне жана кайсы учурларда колдонуш керек?

sobes.tech AI

AIден жооп

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
Иш жүзүндө Атау менен белгиленген константтардын чектелген тизмеси Чектелген типтердин тизмеси
Варианттарда маалымат Жок (тек касиеттер) Ооба (подкласстар аркылуу)
Абаастракт мүчөлөр Жок Ооба
Мураскорлук Жок Ооба, бирок ошол эле файлда/модулда