Ответ
sealed class Resource<out T> {
data class Success<T>(val data: T) : Resource<T>()
data class Error(val exception: Exception) : Resource<Nothing>()
object Loading : Resource<Nothing>()
}
// Использование
fun loadData() {
when (val result = fetchData()) {
is Resource.Success -> showData(result.data)
is Resource.Error -> showError(result.exception)
Resource.Loading -> showLoading()
}
}
private fun fetchData(): Resource<String> {
return try {
Resource.Success("Data loaded")
} catch (e: Exception) {
Resource.Error(e)
}
}
Sealed class идеально подходит для представления ограниченного набора состояний. В примере показаны три возможных состояния загрузки данных: успех, ошибка и процесс загрузки. Кейсы обрабатываются через when-expression, что обеспечивает безопасность типов (компилятор проверит все варианты).