Geschichte der Frage: Kotlin unterstützt seit Beginn einen Mechanismus der "Destrukturierung", der es ermöglicht, Werte aus Objekten, Sammlungen und Rückgabewerten von Funktionen bequem zu extrahieren. Dieser Mechanismus ist inspiriert von Sprachen wie Scala und JavaScript (ES6 Destructuring).
Problem: In klassischen OOP-Sprachen musste man, um mehrere Eigenschaften eines Objekts zu extrahieren, entweder explizit auf jedes Feld zugreifen oder auf Zwischenstrukturen zurückgreifen, was zu Verbohrtheit führte. Insbesondere ist dies in Schleifen, bei der Verarbeitung von Paaren aus Maps oder bei der Arbeit mit Data Classes unpraktisch.
Lösung: Destructuring-Deklarationen ermöglichen es, mehrere Variablen zu deklarieren und ihnen Werte aus einem Objekt in einer Zeile zuzuweisen, dank der Implementierung von Komponentenfunktionen (componentN) in Klassen.
Beispielcode:
data class Person(val name: String, val age: Int) val (n, a) = Person("Alex", 25) println("Name: $n, Alter: $a") // Name: Alex, Alter: 25 val map = mapOf(1 to "a", 2 to "b") for ((key, value) in map) println("$key = $value")
Schlüsselmerkmale:
Kann man jede Klasse destrukturieren?
Nein. Methoden componentN sind erforderlich. Data Classes und Standard-Paaren/Dreien haben diese bereits. Für gewöhnliche Klassen können sie manuell hinzugefügt werden.
Beispiel:
class Point(val x: Int, val y: Int) { operator fun component1() = x operator fun component2() = y } val (cx, cy) = Point(5, 10)
Was passiert, wenn man versucht, ein Objekt mit weniger componentN zu destrukturieren?
Der Compiler wirft einen Fehler, wenn man versucht, mehr Variablen zu deklarieren, als componentN implementiert sind:
data class OnlyX(val x: Int) val (x, y) = OnlyX(5) // Fehler! Kein component2()
Ist es möglich, in einer Funktion den Rückgabewert zu destrukturieren?
Ja! Eine Funktion kann ein Paar (Pair), eine Dreiergruppe (Triple) oder eine Data Class zurückgeben – Destrukturierung unterstützt das:
fun coords() = Pair(1, 2) val (x, y) = coords()
Eine Data Class mit fünf Feldern wird in die Funktion übergeben; Destrukturierung wird mit fünf Variablen verwendet. Nach einiger Zeit wird ein Feld hinzugefügt — das Muster erfordert eine Überarbeitung der gesamten Parse-Logik, es entstehen an einigen Stellen ungenutzte Variablen.
Vorteile:
Nachteile:
Destrukturierung wird nur für Data Classes mit 2–3 Feldern verwendet (z. B. x, y Koordinaten) oder bei der Iteration über eine Map, wo die Struktur garantiert festgelegt ist.
Vorteile:
Nachteile: