Destructurerende declaraties in Kotlin stellen je in staat om objecten direct in hun samenstellende delen uit te pakken in variabele declaraties, waardoor de code duidelijker en beknopter wordt.
Standaard werkt destructureren met data-klassen en wordt het ondersteund voor verzamelingen (via component-functies). Het is gebaseerd op het gebruik van componentN()-functies binnen de klasse van het object.
Voorbeeld met een data-klasse:
data class User(val name: String, val age: Int) val user = User("Oleg", 32) val (name, age) = user println(name) // "Oleg" println(age) // 32
Voorbeeld voor een aangepaste klasse:
class Point(val x: Int, val y: Int) { operator fun component1() = x operator fun component2() = y } val point = Point(1, 2) val (a, b) = point
Details en nuances:
for ((k, v) in map), waar k en v sleutels/waarde-paren opleveren.Vraag: "Kun je destructureren gebruiken voor een klasse die geen data-klasse is, en wat zijn de vereisten daarvoor?"
Antwoord: Ja. Je moet handmatig de operator componentN-functies binnen de klasse definiëren. Een data-klasse genereert ze automatisch, maar elke klasse kan ze expliciet bieden.
Voorbeeld:
class Pair<A, B>(val first: A, val second: B) { operator fun component1() = first operator fun component2() = second } val p = Pair(1, "q") val (a, b) = p
Geval
In een project gebruikten ze destructureren met Map en gingen ze er ten onrechte van uit dat destructureren beschikbaar was voor elke iterable collectie. Als gevolg hiervan traden "ComponentN ontbreekt"-fouten op voor List, waar meerdere componenten werden verwacht maar er slechts één bestond, wat leidde tot applicatiecrashes.
Geval
In één module werd destructureren toegepast op aangepaste klassen, maar na refactoring vergaten ze operator
componentN-functies toe te voegen; als gevolg daarvan compileerde de code maar gafNoSuchMethodErrortijdens runtime, waardoor de productie service uitviel.
Geval
Een data-klasse werd gewijzigd — de attributen werden opnieuw geordend, maar de oude destructurerende declaraties werden ongewijzigd gelaten. Het resultaat: waarden werden aan de verkeerde variabelen toegewezen, wat een ernstige bug in de bedrijfslogica in productie veroorzaakte.