sealed class w Kotlinie to klasa abstrakcyjna, która ogranicza hierarchię dziedziczenia: wszystkie podtypy muszą być zadeklarowane w tym samym pliku. To jest wygodne dla hierarchii, w których zestaw opcji jest stały (na przykład do opisu stanów, zdarzeń lub błędów):
sealed class Result { object Success : Result() data class Error(val message: String) : Result() object Loading : Result() } fun handle(result: Result) = when (result) { is Result.Success -> print("Sukces!") is Result.Error -> println("Błąd: ${result.message}") is Result.Loading -> println("Ładowanie...") }
Związek z when:
Jeśli używamy wszystkich podtypów sealed class w wyrażeniu when, kompilator sprawdza exhaustiveness (wyczerpujące rozpatrzenie opcji). Gwarantuje to, że przy dodawaniu nowego stanu deweloper otrzyma błąd kompilacji, jeśli nie obsłuży nowej opcji.
Po co to potrzebne:
"Czy można umieszczać dziedziczących po sealed class w różnych plikach lub pakietach? Jak to wpływa na type-safety?"
Odpowiedź: Nie, wszyscy bezpośredni dziedziczący po sealed class muszą być zdefiniowani w tym samym pliku. To kontrola kompilatora dla zapewnienia type-safety. Jeśli dziedziczących umieści się w innych plikach pakietu, kompilator zgłosi błąd.
Historia
Podczas projektowania logiki biznesowej płatności dodano opcje wyników operacji, zapominając zaktualizować wyrażenie when. Ale dzięki sealed class, kompilator podświetlił nieuwzględnione przypadki. W innym projekcie w Javie ten scenariusz doprowadziłby do wystąpienia niezinicjowanego statusu w produkcie.
Historia
W projekcie po migracji części danych z sealed class na zwykłe open class przestały działać exhaustywne kontrole when — nowe statusy zaczęły "ginąć" w logice przetwarzania, co powodowało nieprawidłowe zachowanie interfejsu.
Historia
W systemie e-commerce podjęto próbę optymalizacji architektury przez przeniesienie dziedziczących po sealed class do oddzielnych plików (każdy — w swoim module do ponownego wykorzystania). To uszkodziło kompilację i stało się przyczyną pilnego refaktoryzowania przed wydaniem.