Sobes.tech
Middle

Запознат ли си със sealed класовете и каква е тяхната особеност?

sobes.tech AI

Отговор от AI

Да, запознат съм.

Характеристиката на 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).