Sobes.tech
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.