Sealed Class trong Kotlin
🎯 Mục tiêu: Hiểu Sealed Class - restricted class hierarchy cho pattern matching mạnh mẽ.
💡 Khái niệm
Sealed class giới hạn subclasses chỉ có thể định nghĩa trong cùng file (hoặc module từ Kotlin 1.5). Compiler biết tất cả subclasses → exhaustive when.
sealed class Result {
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()
object Loading : Result()
}📝 Sử dụng với when
fun handleResult(result: Result): String = when (result) {
is Result.Success -> "Data: ${result.data}"
is Result.Error -> "Error: ${result.message}"
Result.Loading -> "Loading..."
// Không cần else!
}🎯 Sealed vs Enum
| Sealed Class | Enum |
|---|---|
| Subclasses có thể có state khác nhau | Mỗi value có cùng structure |
| Subclass có thể là class, data class, object | Chỉ có enum constants |
| Dùng cho complex hierarchies | Dùng cho fixed set of values |
// Enum - mỗi value giống nhau
enum class SimpleStatus { LOADING, SUCCESS, ERROR }
// Sealed - mỗi subclass khác nhau
sealed class DetailedStatus {
object Loading : DetailedStatus()
data class Success(val data: List<Item>) : DetailedStatus()
data class Error(val code: Int, val message: String) : DetailedStatus()
}📱 Use Case: UI State
sealed class UiState<out T> {
object Loading : UiState<Nothing>()
data class Success<T>(val data: T) : UiState<T>()
data class Error(val exception: Throwable) : UiState<Nothing>()
}
// Trong ViewModel
class UserViewModel : ViewModel() {
private val _state = MutableStateFlow<UiState<User>>(UiState.Loading)
val state: StateFlow<UiState<User>> = _state
fun loadUser() {
viewModelScope.launch {
_state.value = UiState.Loading
try {
val user = repository.getUser()
_state.value = UiState.Success(user)
} catch (e: Exception) {
_state.value = UiState.Error(e)
}
}
}
}
// Trong UI
when (val state = viewModel.state.collectAsState().value) {
is UiState.Loading -> LoadingSpinner()
is UiState.Success -> UserProfile(state.data)
is UiState.Error -> ErrorMessage(state.exception.message)
}🔧 Sealed Interface (Kotlin 1.5+)
sealed interface Error {
data class NetworkError(val code: Int) : Error
data class DatabaseError(val query: String) : Error
object UnknownError : Error
}✅ Checklist
- Tạo sealed class với subclasses
- Sử dụng exhaustive when
- Phân biệt sealed class vs enum
- Áp dụng cho UI state pattern
Tiếp theo: Inheritance
Last updated on