Destructuring declarations maken het mogelijk om een object direct in variabelen te "splitsen" bij de declaratie, wat de code beknopt maakt. Historisch gezien moest in Java en andere talen een aparte getter voor elk onderdeel worden geschreven, wat de syntax omvangrijk maakte. Kotlin introduceerde speciale componentN() methoden ter ondersteuning van destructuring.
Probleem: Het is onhandig om handmatig delen van een samengesteld object te verkrijgen — er moet veel toegewezen worden, waardoor de code minder leesbaar wordt.
Oplossing: Data classes krijgen bij het compileren automatisch componentN() methoden, die het mogelijk maken om destructuring declarations te gebruiken voor het verkrijgen van eigenschapswaarden.
Voorbeeldcode:
data class User(val name: String, val age: Int) val user = User("Pavel", 32) val (name, age) = user println("$name is $age years old") // Pavel is 32 years old
Belangrijke kenmerken:
Hoeveel variabelen kunnen worden verkregen via destructuring declaration?
Zoveel als er componentN() methoden in de class zijn gedefinieerd. Voor data classes worden automatisch methoden voor alle eigenschappen van de primary constructor aangemaakt (tot 255).
Werkt destructuring met gewone (geen data) classes?
Alleen als er handmatig componentN() methoden in de class zijn gedeclareerd.
Voorbeeld:
class Point(val x: Int, val y: Int) { operator fun component1() = x operator fun component2() = y } val (x, y) = Point(10, 20)
Kun je waarden overslaan in destructuring declaration?
Ja, gebruik _ (underscore) om externe variabelen over te slaan.
val (_, onlyAge) = user
Negatieve case
In een project probeerde een ontwikkelaar destructuring te gebruiken voor een gewone class zonder componentN() methoden, wat leidde tot een compilerfout, waarna hij deze handmatig toevoegde voor een zeer grote class (10+ eigenschappen).
Voordelen:
Nadelen:
Positieve case
Gebruik van een data class met een beperkt aantal parameters (bijvoorbeeld, Result(val data: T, val error: Throwable?)), met een beknopte destructuring declaration bij het verwerken van een reactie in een API.
Voordelen:
Nadelen: