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
whenwyczerpujące: Kompilator gwarantuje, że blokwhendla instancji klasy sealed jest wyczerpujący (wszystkie przypadki są obsłużone), jeśli nie określono gałęzielse. 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.