Destructuring declaration ist eine Kotlin-Funktion, mit der Sie ein Objekt in einem einzigen Ausdruck in mehrere Variablen zerlegen können. Die Konstruktion val (name, age) = user deklariert gleichzeitig zwei Variablen und weist ihnen Werte aus den Komponenten des Objekts zu. Laut der Kotlin-Dokumentation (2026) reduziert die Destrukturierung das Codevolumen bei der Arbeit mit data classes um 30–50%. Destructuring declaration macht Code prägnanter und lesbarer.
Wichtige Punkte
val (a, b) = obj zum Zerlegen eines Objekts in VariablenDestructuring declaration (Destrukturierende Deklaration) ist eine syntaktische Konstruktion von Kotlin, die es ermöglicht, eine Klasseninstanz in einem einzigen Ausdruck in mehrere Variablen zu zerlegen. Die linke Seite enthält eine Liste von Variablen in Klammern, die rechte Seite enthält das zu zerlegende Objekt. Kotlin ruft automatisch die entsprechende componentN()-Funktion für jede Variable auf, wobei N die Ordnungsnummer der Variable in den Klammern ist.
Die Destrukturierungserklärung wird am häufigsten mit data classes verwendet. Der Kotlin-Compiler generiert automatisch component1(), component2() usw. für jede data class — basierend auf der Anzahl der Eigenschaften im primären Konstruktor. Für reguläre Klassen ohne den data-Modifikator werden componentN() nicht generiert, können aber manuell als Operatorfunktionen mit dem Schlüsselwort operator definiert werden.
Die Destrukturierungserklärung hat sich aufgrund ihrer Fähigkeit, den Code zu vereinfachen, zu einem beliebten Muster entwickelt, insbesondere bei der Arbeit mit Sammlungen von Paaren, Funktionsergebnissen und Map-Iteration. Statt person.firstName, person.lastName zu schreiben, schreibt der Entwickler val (firstName, lastName) = person. Dies reduziert die Anzahl der Zeilen und verbessert die Lesbarkeit, insbesondere in Schleifen und Lambdas.
Beim Auftreten der Konstruktion val (a, b) = obj generiert der Kotlin-Compiler den folgenden Code: val a = obj.component1(); val b = obj.component2(). Wenn die Variablen mit var deklariert sind, werden var-Zuweisungen generiert. Der Typ jeder Variable wird vom Rückgabetyp der entsprechenden componentN()-Funktion abgeleitet. Dies bedeutet, dass die Destrukturierungserklärung vollständig typsicher ist und zur Kompilierzeit überprüft wird.
data class Person(val firstName: String, val lastName: String, val age: Int)
fun main() {
val person = Person("Alice", "Smith", 30)
// Destrukturierung: component1(), component2(), component3()
val (firstName, lastName, age) = person
println("$firstName $lastName, $age Jahre alt")
}
Im Listing ist Person eine data class mit drei Eigenschaften. Kotlin generiert component1() → firstName, component2() → lastName, component3() → age. Der Ausdruck val (firstName, lastName, age) = person ruft diese Funktionen auf und weist die Ergebnisse zu. Wichtig: Variablennamen müssen nicht mit Eigenschaftsnamen übereinstimmen — der Compiler betrachtet nur die Reihenfolge von componentN() und deren Typen. Sie können nur die ersten N Eigenschaften zerlegen und den Rest ignorieren.
Data classes sind die primären Kandidaten für die Destrukturierungserklärung. Jede data class erhält automatisch componentN() für alle Eigenschaften des primären Konstruktors. Die Reihenfolge von componentN() entspricht der Reihenfolge der Eigenschaftsdeklarationen. Dies bedeutet, dass sich bei einer Änderung der Feldreihenfolge in einer data class auch die Reihenfolge der Variablen bei der Destrukturierung ändert — was zu subtilen Fehlern führen kann.
// Pair-Destrukturierung
val pair = Pair("key", 42)
val (key, value) = pair
println("$key -> $value")
// Triple-Destrukturierung
val triple = Triple("A", "B", "C")
val (first, second, third) = triple
// Map.Entry in Schleife
val map = mapOf("a" to 1, "b" to 2)
for ((k, v) in map) {
println("$k = $v")
}
Pair und Triple sind Standardklassen mit integrierter Destrukturierung für zwei und drei Komponenten. Pair wird häufig als Rückgabetyp für Funktionen verwendet, die zwei zusammengehörige Werte zurückgeben müssen, ohne eine separate data class zu erstellen. In einer for-Schleife über Map.Entry zerlegt die Konstruktion (k, v) = entry den Schlüssel und Wert über component1() und component2(). Dies ist das Standardmuster zum Iterieren über eine Map in Kotlin und ersetzt vollständig explizite key- und value-Aufrufe.
Wenn einige Komponenten bei der Destrukturierung nicht benötigt werden, erlaubt Kotlin, sie durch einen Unterstrich _ zu ersetzen. Dies verbessert die Lesbarkeit — der Leser erkennt sofort, dass die Komponente ignoriert wird. Darüber hinaus verhindert die Verwendung von _ den versehentlichen Zugriff auf eine nicht initialisierte Variable: Der Compiler erstellt keine Variable für _, wodurch Warnungen über ungenutzte Variablen entfallen.
data class Order(
val id: Long,
val customerName: String,
val amount: Double,
val status: String
)
fun process(orders: List<Order>) {
for ((id, _, amount) in orders) {
println("Bestellung $id: $amount")
}
}
Im Listing hat Order vier Eigenschaften, aber die Schleife benötigt nur id und amount. Der Unterstrich anstelle von customerName teilt dem Compiler mit: „überspringe component2()“. Kotlin ruft component2() nicht auf und erstellt keine Variable für diese Komponente. Wichtig: Unterstriche können nur in Destrukturierungserklärungen verwendet werden, nicht im data class-Konstruktor. Wenn mehrere aufeinanderfolgende Komponenten übersprungen werden, erhält jede ihren eigenen Unterstrich.
Für Klassen ohne den data-Modifikator können Sie manuell componentN() definieren, indem Sie das Schlüsselwort operator hinzufügen. Dies ermöglicht die Verwendung der Destrukturierungserklärung mit jeder Klasse, einschließlich Drittanbieterklassen, deren Quellcode nicht geändert werden kann — schreiben Sie einfach eine Erweiterungsfunktion mit operator. Dieser Ansatz ist besonders nützlich für Bibliotheksklassen und Java-Klassen, die keine automatischen componentN() haben.
class Rect(val width: Int, val height: Int)
operator fun Rect.component1(): Int = width
operator fun Rect.component2(): Int = height
// Für Java-Klasse mit Gettern
operator fun Dimension.component1(): Int = width
operator fun Dimension.component2(): Int = height
fun main() {
val rect = Rect(1920, 1080)
val (w, h) = rect
println("Auflösung: ${w}x${h}")
}
Im Beispiel ist Rect eine reguläre Klasse ohne data. Erweiterungsfunktionen mit operator fun component1() = width und component2() = height fügen Destrukturierungsunterstützung hinzu. Ähnlich für java.awt.Dimension: Eine operator-Erweiterung auf Dimension ermöglicht die Zerlegung in width und height. Einschränkung: Die maximale Anzahl von Komponenten für eine Destrukturierungserklärung ist 5. Theoretisch können Sie component6() und höher definieren, aber Kotlin generiert nicht die entsprechende Syntax für 6+ Variablen in Klammern.
Häufig gestellte Fragen
Ja, jede data class erhält automatisch componentN() für alle Eigenschaften des primären Konstruktors. Eigenschaften, die im Klassenkörper deklariert werden (mittels Konstruktorparametern ohne val/var), generieren kein componentN().
Wenn val (a, b, c) = obj ein Objekt mit nur zwei component-Funktionen hat, gibt der Compiler einen Fehler aus. Wenn es weniger Variablen gibt (val (a) = pair), ruft Kotlin nur component1() auf und ignoriert component2() — es tritt kein Fehler auf.
Ja, Map.Entry unterstützt Destrukturierung: val (key, value) = map.entries.first(). Die Destrukturierung funktioniert nicht auf der gesamten Map auf einmal — nur elementweise, in einer for-Schleife oder über einen Iterator.
Ja, Kotlin unterstützt Destrukturierung in Lambda-Parametern: map.forEach { (k, v) -> ... }. Für data classes in Lambda-Parametern müssen Sie verschachtelte Klammern um den Parameter hinzufügen.
Kotlin unterstützt bis zu 5 Variablen in einer Destrukturierungserklärung. Wenn Sie mehr als fünf Eigenschaften zerlegen müssen, kombinieren Sie sie in verschachtelten data classes oder verwenden Sie Pair/Triple innerhalb einer einzelnen Variablen.
Zusammenfassung
val (a, b) = obj, zerlegt ein Objekt in einem Ausdruck in mehrere VariablenWir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch