Middle
Wat zijn 'sealed' klassen in Kotlin en in welke gevallen moeten ze worden gebruikt?
sobes.tech AI
Antwoord van AI
De sealed klasse wordt gebruikt om een beperkte hiërarchie van klassen weer te geven. Alle directe subtypen van een sealed klasse moeten in hetzelfde bestand als de sealed klasse zelf worden gedefinieerd, of in dezelfde modules (voor Kotlin 1.5+). Dit stelt de compiler in staat om te controleren dat alle mogelijke subtypen worden afgehandeld in een when-uitdrukking, waardoor deze volledig is zonder de noodzaak van een else-tak.
Belangrijke kenmerken:
- Alle directe subklassen moeten lokaal zijn.
- De constructor van de
sealedklasse is standaardprivate. - De
sealedklasse kan niet abstract zijn. - Het niet toestaan van het maken van instanties.
Gebruiksscenario's:
- Weergave van een beperkte set staten of resultaten. Bijvoorbeeld,
Loading,Success(data),Error(message).sealed class Result<out T> { data class Success<T>(val data: T) : Result<T>() data class Error(val message: String) : Result<Nothing>() object Loading : Result<Nothing>() } - Afhandeling van varianten in een
when-uitdrukking met garantie op volledigheid.fun processResult(result: Result<String>) { when (result) { is Result.Success -> println("Data ontvangen: ${result.data}") is Result.Error -> println("Fout: ${result.message}") Result.Loading -> println("Laden...") } // Geen behoefte aan een `else`-tak, omdat de compiler alle subtypen kent. } - Gebruik als equivalent van enumeraties met de mogelijkheid om gegevens te encapsuleren in elke variant.
Vergelijking met enum-classes:
| Kenmerk | enum class |
sealed class |
|---|---|---|
| Instanties | Beperkt aantal benoemde constanten | Beperkt aantal typen |
| Gegevens in varianten | Nee (alleen eigenschappen) | Ja (via subklassen) |
| Abstracte leden | Nee | Ja |
| Overerving | Nee | Ja, maar beperkt tot hetzelfde bestand/module |