Destructuring declaration — is de mogelijkheid van Kotlin om een object in meerdere variabelen in één expressie te ontleden. De constructie val (name, age) = user declareert tegelijkertijd twee variabelen en wijst ze waarden toe uit de componenten van het object. Volgens de Kotlin-documentatie (2026) vermindert destructuring de codehoeveelheid bij het werken met data class met 30–50%. Destructuring declaration maakt de code beknopter en leesbaarder.
Belangrijkste punten
Destructuring declaration (destructurerende declaratie) — is een syntactische constructie in Kotlin waarmee je een instantie van een klasse in één expressie in meerdere variabelen kunt ontleden. De linkerkant bevat de lijst met variabelen tussen haakjes, de rechterkant — het te ontleden object. Kotlin roept automatisch voor elke variabele de bijbehorende functie componentN() aan, waarbij N het volgnummer van de variabele tussen haakjes is.
Destructuring declaration wordt het vaakst gebruikt met data class. De Kotlin-compiler genereert automatisch voor data class de functies component1(), component2() enzovoort — op basis van het aantal eigenschappen in de primaire constructor. Voor gewone klassen zonder de modifier data worden componentN() niet gegenereerd, maar ze kunnen handmatig worden gedefinieerd als operatorfuncties met het sleutelwoord operator.
Destructuring declaration is een populair patroon geworden vanwege zijn vermogen om code te vereenvoudigen bij het werken met verzamelingen paren, functieresultaten en het doorlopen van Map. In plaats van person.firstName, person.lastName schrijft de ontwikkelaar val (firstName, lastName) = person. Dit vermindert het aantal regels en verhoogt de leesbaarheid, vooral in lussen en lambda's.
Bij het tegenkomen van de constructie val (a, b) = obj genereert de Kotlin-compiler de code: val a = obj.component1(); val b = obj.component2(). Als variabelen zijn gedeclareerd met var, worden var-toewijzingen gegenereerd. Het type van elke variabele wordt afgeleid van het retourtype van de bijbehorende functie componentN(). Dit betekent dat destructuring declaration volledig typeveilig is en wordt gecontroleerd tijdens de compilatiefase.
data class Person(val firstName: String, val lastName: String, val age: Int)
fun main() {
val person = Person("Alice", "Smith", 30)
// Destructuring: component1(), component2(), component3()
val (firstName, lastName, age) = person
println("$firstName $lastName, $age jaar oud")
}
In de listing Person — data class met drie eigenschappen. Kotlin genereert component1() → firstName, component2() → lastName, component3() → age. De expressie val (firstName, lastName, age) = person roept deze functies aan en wijst de resultaten toe. Belangrijk: variabelenamen kunnen afwijken van eigenschapsnamen — de compiler kijkt alleen naar de volgorde van componentN() en hun typen. Je kunt alleen de eerste N eigenschappen ontleden en de rest negeren.
Data class — de belangrijkste kandidaat voor destructuring declaration. Elke data class krijgt automatisch componentN() voor alle eigenschappen van de primaire constructor. De volgorde van componentN() komt overeen met de volgorde van declaratie van eigenschappen. Dit betekent dat bij het wijzigen van de veldvolgorde in data class de volgorde van variabelen in destructuring verandert — wat kan leiden tot onzichtbare bugs.
// Pair-destructuring
val pair = Pair("key", 42)
val (key, value) = pair
println("$key -> $value")
// Triple-destructuring
val triple = Triple("A", "B", "C")
val (first, second, third) = triple
// Map.Entry in lus
val map = mapOf("a" to 1, "b" to 2)
for ((k, v) in map) {
println("$k = $v")
}
Pair en Triple — standaardklassen met kant-en-klare destructuring voor twee en drie componenten. Pair wordt vaak gebruikt als retourtype van functies die twee gerelateerde waarden moeten retourneren zonder een aparte data class te maken. In een for-lus over Map.Entry ontleedt de constructie (k, v) = entry de sleutel en waarde via component1() en component2(). Dit is het standaardpatroon voor het doorlopen van Map in Kotlin, dat expliciete aanroepen van key en value volledig vervangt.
Als bij destructuring sommige componenten niet nodig zijn, staat Kotlin toe ze te vervangen door een onderstreping _. Dit verbetert de leesbaarheid — de lezer ziet meteen dat de component wordt genegeerd. Bovendien voorkomt het gebruik van _ de per ongeluk toegang tot een niet-geïnitialiseerde variabele: de compiler maakt geen variabele voor _, waardoor waarschuwingen over ongebruikte variabelen worden geëlimineerd.
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("Bestelling $id: $amount")
}
}
In de listing heeft Order vier eigenschappen, maar in de lus zijn alleen id en amount nodig. De onderstreping op de plaats van customerName vertelt de compiler ‘sla component2() over’. Kotlin roept component2() niet aan en maakt geen variabele voor deze component. Belangrijk: onderstreping kan alleen worden gebruikt in destructuring declaration, maar niet in de data class-constructor. Als meerdere componenten achter elkaar worden overgeslagen, heeft elk zijn eigen onderstreping.
Voor klassen zonder de modifier data kun je handmatig componentN() definiëren door het sleutelwoord operator toe te voegen. Hiermee kun je destructuring declaration gebruiken met elke klasse, inclusief externe klassen waarvan de broncode niet kan worden gewijzigd — het volstaat om een extensiefunctie met operator te schrijven. Deze benadering is vooral nuttig voor bibliotheekklassen en klassen uit Java-code die geen automatische componentN() hebben.
class Rect(val width: Int, val height: Int)
operator fun Rect.component1(): Int = width
operator fun Rect.component2(): Int = height
// Voor Java-klasse met getters
operator fun Dimension.component1(): Int = width
operator fun Dimension.component2(): Int = height
fun main() {
val rect = Rect(1920, 1080)
val (w, h) = rect
println("Resolutie: ${w}x${h}")
}
In het voorbeeld is Rect — een gewone klasse zonder data. Extensiefuncties met operator fun component1() = width en component2() = height voegen ondersteuning voor destructuring toe. Op dezelfde manier voor java.awt.Dimension: een operator-extensie op Dimension maakt het mogelijk deze in width en height te ontleden. Beperking: het maximale aantal componenten voor destructuring declaration is 5. In theorie kun je component6() en hoger definiëren, maar Kotlin zal geen overeenkomstige syntaxis genereren voor 6+ variabelen tussen haakjes.
Veelgestelde vragen
Ja, elke data class krijgt automatisch componentN() voor alle eigenschappen van de primaire constructor. Eigenschappen gedeclareerd in de klasse-body (via constructor zonder val/var) genereren geen componentN().
Als in val (a, b, c) = obj het object slechts twee componentfuncties heeft, geeft de compiler een foutmelding. Als er minder variabelen zijn (val (a) = pair), roept Kotlin alleen component1() aan en negeert component2() — er treedt geen fout op.
Ja, Map.Entry ondersteunt destructuring: val (key, value) = map.entries.first(). Voor de gehele Map tegelijk werkt destructuring niet — alleen element voor element, in een for-lus of via een iterator.
Ja, Kotlin ondersteunt destructuring in lambda-parameters: map.forEach { (k, v) -> ... }. Voor data class in lambda-parameters moeten geneste haakjes rond de parameter worden toegevoegd.
Kotlin ondersteunt tot 5 variabelen in destructuring declaration. Als je meer dan vijf eigenschappen moet ontleden, combineer ze dan in geneste data classes of gebruik Pair/Triple binnen één variabele.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook