Sealed class (запечатанный класс) — это специальный тип класса в Kotlin, который:
sealed class Result<out T> {
data class Success<T>(val data: T) : Result<T>()
data class Error(val exception: Exception) : Result<Nothing>()
object Loading : Result<Nothing>()
}
Ограниченное наследование:
Когда использовать:
Преимущества перед enum:
sealed class UiState {
object Loading : UiState()
data class Success(val data: List<Item>) : UiState()
data class Error(val message: String) : UiState()
}
// Использование
when (val state = viewModel.uiState) {
is UiState.Loading -> showProgressBar()
is UiState.Success -> updateList(state.data)
is UiState.Error -> showError(state.message)
}
sealed class ApiResult<out T> {
data class Success<T>(val response: T) : ApiResult<T>()
data class Failure(val error: String) : ApiResult<Nothing>()
}
fun handleResult(result: ApiResult<User>) {
when (result) {
is ApiResult.Success -> println("User: ${result.response}")
is ApiResult.Failure -> println("Error: ${result.error}")
}
}
sealed class AnalyticsEvent {
data class ButtonClicked(val buttonId: String) : AnalyticsEvent()
data class ScreenViewed(val screenName: String) : AnalyticsEvent()
object UserLoggedOut : AnalyticsEvent()
}
fun logEvent(event: AnalyticsEvent) = when (event) {
is ButtonClicked -> track("button_${event.buttonId}_click")
is ScreenViewed -> track("screen_${event.screenName}_view")
UserLoggedOut -> track("user_logout")
}
Характеристика | Sealed class | Enum class | Abstract class |
---|---|---|---|
Экземпляры | Множество разных типов | Фиксированные константы | Нельзя создать экземпляр |
Состояние | Может иметь поля | Одно состояние | Может иметь поля |
Наследование | Только внутри файла | Нет наследования | Любые подклассы |
Когда использовать | Ограниченная иерархия | Фиксированные значения | Общая реализация |
Sealed class — мощный инструмент для:
Основные преимущества:
Рекомендации:
Sealed classes делают код более выразительным и безопасным, уменьшая вероятность ошибок времени выполнения.