Sobes.tech
Middle

Czym są klasy sealed i jakie jest ich przeznaczenie?

sobes.tech AI

Odpowiedź od AI

Klasy sealed (zamknięte) reprezentują ograniczone hierarchie klas. Są używane do reprezentowania ograniczonego zestawu możliwych stanów lub wartości.

Główne cechy i cel:

  • Ograniczona hierarchia: Podklasy klasy sealed muszą być zadeklarowane w tym samym pliku lub zagnieżdżone wewnątrz klasy sealed przed Kotlinem 1.5. Od wersji 1.5 to ograniczenie zostało złagodzone: podklasy mogą być w dowolnym pliku tego samego pakietu.
  • Klasy enum z stanem: W przeciwieństwie do klas enum, każda podklasa sealed może mieć własny stan i zachowanie.
  • Wyrażenie when wyczerpujące: Kompilator gwarantuje, że blok when dla instancji klasy sealed jest wyczerpujący (wszystkie przypadki są obsłużone), jeśli nie określono gałęzi else. To zmniejsza ryzyko błędów podczas wykonywania.

Przykład:

sealed class Result<out T> {
    data class Success<out T>(val data: T) : Result<T>()
    data class Error(val exception: Exception) : Result<Nothing>()
    object Loading : Result<Nothing>() // Pojedyncza instancja
}

fun processResult(result: Result<String>) {
    when (result) {
        is Result.Success -> {
            // Obsługa pomyślnego wyniku
            println("Data: ${result.data}")
        }
        is Result.Error -> {
            // Obsługa błędu
            println("Error: ${result.exception.message}")
        }
        Result.Loading -> {
            // Obsługa stanu ładowania
            println("Loading data...")
        }
        // Nie jest wymagana gałąź else, ponieważ wszystkie podklasy
        // Result są obsłużone przez kompilator
    }
}

Cel:

  • Bezpieczne przedstawienie stanów: Wiarygodne przedstawienie skończonej liczby możliwych stanów, np. wynik zapytania sieciowego (Success, Error, Loading).
  • Poprawa czytelności kodu: Uczynienie kodu bardziej jawnego przy obsłudze różnych przypadków.
  • Zwiększenie niezawodności wyrażeń when: Kompilator pomaga unikać nieobsłużonych przypadków.
  • Zastąpienie klas enum z stanem: Gdy konieczne jest powiązanie danych z konkretnymi "wariantami" wyliczenia.

W ten sposób klasy sealed zapewniają elastyczny sposób modelowania skończonych zbiorów wartości z możliwością przechowywania specyficznych danych dla każdej wartości, jednocześnie zapewniając bezpieczeństwo i jawność przy obsłudze tych wartości w wyrażeniach when.