Sobes.tech
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 sealed klasse is standaard private.
  • De sealed klasse 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