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).