Middle
Jak używać zamkniętych klas do modelowania hierarchii w Kotlin?
sobes.tech AI
Odpowiedź od AI
Zamknięte klasy (sealed classes) służą do reprezentowania ograniczonych hierarchii dziedziczenia, gdzie wszystkie możliwe podklasy są znane na etapie kompilacji.
Główne cechy:
- Wszystkie bezpośrednie podklasy muszą znajdować się w tym samym pliku co klasa zamknięta (przed Kotlin 1.5). Od Kotlin 1.5 mogą być w dowolnym pliku tej samej kompilacji.
- Podklasy klasy zamkniętej mogą być zwykłymi klasami, klasami danych, deklaracjami object lub innymi klasami zamkniętymi.
- Konstruktor klasy zamkniętej jest domyślnie prywatny; inne modyfikatory (public, protected, internal) nie są dozwolone.
- Umożliwiają użycie wyczerpującej analizy (
exhaustive) w wyrażeniach when, co gwarantuje obsługę wszystkich możliwych wariantów i eliminuje konieczność użycia gałęzi else.
Przykład użycia do modelowania stanu interfejsu użytkownika:
sealed class UiState {
object Loading : UiState() // Stan ładowania
data class Success(val data: String) : UiState() // Pomyślne pobranie danych
data class Error(val message: String) : UiState() // Błąd
}
Użycie w wyrażeniu when:
fun handleUiState(state: UiState): String {
return when (state) {
UiState.Loading -> "Ładowanie danych..."
is UiState.Success -> "Dane pomyślnie załadowane: ${state.data}"
is UiState.Error -> "Błąd: ${state.message}"
}
}
Zalety:
- Bezpieczeństwo typu: kompilator sprawdza, czy wszystkie możliwe podklasy są obsługiwane.
- Czytelność: wyraźnie pokazuje, jakie warianty danych lub stanów mogą istnieć.
- Wygoda: upraszcza pracę z wyrażeniami
when.