Sobes.tech
Middle

Šta su 'sealed' klase u Kotlinu i u kojim slučajevima ih treba koristiti?

sobes.tech АИ

Одговор од АИ

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 class sealed class
Екземпляри Ограничен број именованих константи Ограничен број типова
Податке у варијантама Не (само својства) Да (преко подкласа)
Аутоматски чланови Не Да
Наслеђивање Не Да, али ограничено у истом фајлу/модулу