Sobes.tech
Middle

Да ли познајеш sealed класе и у чему је њихова особеност?

sobes.tech АИ

Одговор од АИ

Да, познајем.

Особеност sealed класа је што они омогућавају ограничење хијерархије наслеђивања. Сви директни подтипови sealed класе морају бити објављени у истом фајлу. Ово осигурава да компајлер зна све могуће подтипове, што је корисно за проверу потпуности у изразима when.

Пример:

sealed class Result {
    data class Success(val message: String) : Result()
    data class Error(val code: Int, val description: String) : Result()
    object Loading : Result() // Јединствени објекат за стање учитавања
}

fun processResult(result: Result) {
    when (result) {
        is Result.Success -> println("Успех: ${result.message}")
        is Result.Error -> println("Грешка ${result.code}: ${result.description}")
        Result.Loading -> println("Учитавање...")
        // Није потребно else, јер компајлер зна све могуће опције
    }
}

Предности:

  • Безбедност: Гарантује потпуност израза when без потребе за else.
  • Јасноћа: Јасно означава ограничени скуп могућих стања или подтипова.
  • Контрола: Превентивно спречава неконтролисано наслеђивање изван класе.

Разлика од enum class: sealed класе могу имати различите типове података за сваки подтип (као Success и Error у примеру), док су елементи enum class статички и могу имати само одређене особине, заједничке за све. sealed класе такође могу имати објекте-екземпляре (Loading).