Sobes.tech
Middle

Was sind 'sealed'-Klassen in Kotlin und in welchen Fällen sollten sie verwendet werden?

sobes.tech KI

Antwort von AI

Die sealed-Klasse wird verwendet, um eine begrenzte Hierarchie von Klassen darzustellen. Alle direkten Unterklassen einer sealed-Klasse müssen im selben Datei wie die sealed-Klasse selbst oder in denselben Modulen definiert sein (für Kotlin 1.5+). Dies ermöglicht dem Compiler zu überprüfen, dass alle möglichen Untertypen in einem when-Ausdruck behandelt werden, wodurch dieser vollständig wird, ohne dass eine else-Klausel erforderlich ist.

Wichtige Merkmale:

  • Alle direkten Unterklassen müssen lokal sein.
  • Der Konstruktor der sealed-Klasse ist standardmäßig private.
  • sealed-Klasse kann nicht abstrakt sein.
  • Es ist nicht erlaubt, Instanzen zu erstellen.

Anwendungsfälle:

  • Darstellung eines begrenzten Satzes von Zuständen oder Ergebnissen. Zum Beispiel 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>()
    }
    
  • Behandlung von Varianten in einem when-Ausdruck mit Garantie auf Vollständigkeit.
    fun processResult(result: Result<String>) {
       when (result) {
          is Result.Success -> println("Daten empfangen: ${result.data}")
          is Result.Error -> println("Fehler: ${result.message}")
          Result.Loading -> println("Lädt...")
       }
       // Es ist keine `else`-Klausel notwendig, da der Compiler alle Untertypen kennt.
    }
    
  • Verwendung als Äquivalent zu Aufzählungstypen mit der Möglichkeit, Daten in jeder Variante zu kapseln.

Vergleich mit enum class:

Merkmal enum class sealed class
Instanzen Begrenzter Satz benannter Konstanten Begrenzter Satz von Typen
Daten in Varianten Nein (nur Eigenschaften) Ja (über Unterklassen)
Abstrakte Mitglieder Nein Ja
Vererbung Nein Ja, aber auf den selben Datei/Modul beschränkt