Geschiedenis van de vraag: Kotlin ondersteunt vanaf het begin het mechanisme van "destructuring", waarmee het handig is om waarden uit objecten, collecties en geretourneerde functiegegevens te extraheren. Dit mechanisme is geïnspireerd door talen zoals Scala en JavaScript (ES6 destructuring).
Probleem: In klassieke OOP-talen was het nodig om expliciet naar elk veld te verwijzen om meerdere eigenschappen van een object te extraheren of om intermediaire structuren te gebruiken, wat leidde tot verbrossing. Dit is vooral ongemakkelijk in lussen, bij de verwerking van paren uit een Map of bij het werken met data classes.
Oplossing: Destructuring declaraties maken het mogelijk om meerdere variabelen te declareren en ze waarden uit een object in één regel toe te wijzen, dankzij de implementatie van componentfuncties (componentN) bij klassen.
Voorbeeldcode:
data class Person(val name: String, val age: Int) val (n, a) = Person("Alex", 25) println("Naam: $n, Leeftijd: $a") // Naam: Alex, Leeftijd: 25 val map = mapOf(1 to "a", 2 to "b") for ((key, value) in map) println("$key = $value")
Belangrijke kenmerken:
Kan je elke klasse destructureren?
Nee. Methoden componentN zijn vereist. Data classes en standaard paren/drieklappers hebben deze al. Voor gewone klassen kunnen ze handmatig worden toegevoegd.
Voorbeeld:
class Point(val x: Int, val y: Int) { operator fun component1() = x operator fun component2() = y } val (cx, cy) = Point(5, 10)
Wat gebeurt er als je probeert een object met minder componentN te destructureren?
De compiler geeft een foutmelding als je meer variabelen probeert te declareren dan er componentN zijn:
data class OnlyX(val x: Int) val (x, y) = OnlyX(5) // Fout! Geen component2()
Is het mogelijk om het geretourneerde waarde in een functie te destructureren?
Ja! Een functie kan een paar (Pair), een drieklapper (Triple) of een data class retourneren — destructuring ondersteunt dit:
fun coords() = Pair(1, 2) val (x, y) = coords()
Een data class met vijf velden wordt aan de functie doorgegeven; destructuring wordt gebruikt met vijf variabelen. Na verloop van tijd is er een veld toegevoegd - het patroon vereist herziening van de hele parse-logica, op sommige plaatsen worden ongebruikte variabelen zichtbaar.
Voordelen:
Nadelen:
Destructuring wordt alleen gebruikt voor data classes met 2-3 velden (bijvoorbeeld x, y coördinaten), of bij het itereren door een map, waar de structuur gegarandeerd vaststaat.
Voordelen:
Nadelen: