Skip to Content

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 ClassEnum
Subclasses có thể có state khác nhauMỗi value có cùng structure
Subclass có thể là class, data class, objectChỉ có enum constants
Dùng cho complex hierarchiesDù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