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