Middle
Šta su sealed klase i koja je njihova svrha?
sobes.tech АИ
Одговор од АИ
Sealed-класси представљају ограничене хијерархије класа. Користе се за представљање ограниченог скупа могућих стања или вредности.
Основне особине и намене:
- Ограничена хијерархија: Наследници sealed-класе морају бити објављени у истој датотеци или унутар sealed-класе пре Kotlin 1.5. Од верзије 1.5, ограничење је олабављено: наследници могу бити у било којој датотеци истог пакета.
- Enum-класе са стањем: За разлику од enum-класа, сваки наследник sealed-класе може имати своје стање и понашање.
- Исцрпна
when: Компилатор гарантује да је блокwhenза примерак sealed-класе исцрпан (сви случајеви су обухваћени), ако није наведенelseветва. Ово смањује вероватноћу грешака током извршавања.
Пример:
sealed class Result<out T> {
data class Success<out T>(val data: T) : Result<T>()
data class Error(val exception: Exception) : Result<Nothing>()
object Loading : Result<Nothing>() // Јединични примерак
}
fun processResult(result: Result<String>) {
when (result) {
is Result.Success -> {
// Обрада успешног резултата
println("Data: ${result.data}")
}
is Result.Error -> {
// Обрада грешке
println("Error: ${result.exception.message}")
}
Result.Loading -> {
// Обрада стања учитавања
println("Loading data...")
}
// `else` ветва није потребна, јер су сви подкласе
// Result обрађене од стране компајлера
}
}
Назначење:
- Безбедно представљање стања: Поуздано представља крајњи број могућих стања, на пример, резултат мрежног захтева (
Success,Error,Loading). - Побољшање читљивости кода: Чини код јаснијим при обради различитих случајева.
- Повећање поузданости
whenизраза: Компилатор помаже у избегавању необрађених случајева. - Замена enum-класа са стањем: Када је потребно повезати податке са одређеним "варијантама" енумерације.
Дакле, sealed-класе пружају флексибилан начин моделовања крајњих скупова вредности са могућношћу чувања специфичних података за сваку вредност, уз обезбеђење безбедности и јасности при обради тих вредности у when изразима.