Sobes.tech
Middle

Erzählen Sie mir von Datenklassen und versiegelten Klassen in Kotlin.

sobes.tech KI

Antwort von AI

Datenklassen in Kotlin werden zum Speichern von Daten verwendet. Sie generieren automatisch nützliche Methoden wie equals(), hashCode(), toString(), copy() sowie Komponenten für die Destrukturierung.

// Beispiel für eine Datenklasse
data class User(val name: String, val age: Int)

Versiegelte Klassen werden verwendet, um eine eingeschränkte Klassenhierarchie darzustellen. Alle Unterklassen müssen im selben Datei wie die versiegelte Klasse definiert werden (in Kotlin 1.5+ wurde diese Einschränkung gelockert). Dies ermöglicht es dem Compiler, eine vollständige Überprüfung der Unterklassen durchzuführen, z.B. in einem when-Ausdruck.

// Beispiel für eine versiegelte Klasse
sealed class Result {
    data class Success(val data: String) : Result()
    data class Error(val message: String) : Result()
    object Loading : Result()
}

// Beispiel für die Verwendung der versiegelten Klasse in einem `when`
fun processResult(result: Result) {
    when (result) {
        is Result.Success -> println("Erfolg: ${result.data}")
        is Result.Error -> println("Fehler: ${result.message}")
        Result.Loading -> println("Lädt...")
    }
}

Hauptunterschiede:

  • Zweck: Datenklassen - Speicherung von Daten, versiegelte Klassen - Einschränkung der Klassenhierarchie.
  • Generierte Methoden: Datenklassen generieren Standardmethoden für Daten, versiegelte Klassen - nicht.
  • Einschränkung der Unterklassen: versiegelte Klassen beschränken die Deklaration von Unterklassen, Datenklassen - nicht.
  • Vollständigkeit bei when: Der Kotlin-Compiler kann die Vollständigkeit der Unterklassen einer versiegelten Klasse in when-Ausdrücken ohne else-Zweig überprüfen.

Sowohl versiegelte Klassen als auch Datenklassen können abstrakt sein, jedoch können Datenklassen nicht open sein (da sie standardmäßig final sind) und können open-Methoden nicht direkt implementieren (nur über Schnittstellen oder abstrakte Klassen). Versiegelte Klassen sind standardmäßig abstrakt, und ihre Konstruktoren sind privat.