Historia de la pregunta: Kotlin ha soportado desde su inicio el mecanismo de "desestructuración", que permite extraer de manera conveniente valores de objetos, colecciones y datos devueltos por funciones. Este mecanismo fue inspirado por lenguajes como Scala y JavaScript (desestructuración de ES6).
Problema: En lenguajes OOP clásicos, para extraer múltiples propiedades de un objeto a menudo era necesario referirse explícitamente a cada campo o recurrir a estructuras intermedias, lo que generaba verbosidad. Esto es especialmente incómodo en bucles, al procesar pares de Map o al trabajar con data class.
Solución: Las declaraciones de desestructuración permiten declarar varias variables y asignarles valores de un objeto en una sola línea, gracias a la implementación de funciones de componente (componentN) en las clases.
Ejemplo de código:
data class Person(val name: String, val age: Int) val (n, a) = Person("Alex", 25) println("Nombre: $n, Edad: $a") // Nombre: Alex, Edad: 25 val map = mapOf(1 to "a", 2 to "b") for ((key, value) in map) println("$key = $value")
Características clave:
¿Se puede desestructurar cualquier clase?
No. Se requieren métodos componentN. Data class y pares/triples estándar ya los contienen. Para clases normales, se pueden agregar manualmente.
Ejemplo:
class Point(val x: Int, val y: Int) { operator fun component1() = x operator fun component2() = y } val (cx, cy) = Point(5, 10)
¿Qué sucede si se intenta desestructurar un objeto con menos componentN?
El compilador genera un error si se intenta declarar más variables de las que existen en componentN:
data class OnlyX(val x: Int) val (x, y) = OnlyX(5) // ¡Error! No hay component2()
¿Es posible desestructurar el valor de retorno de una función?
¡Sí! La función puede devolver un par (Pair), un trío (Triple) o un data class; la desestructuración lo soporta:
fun coords() = Pair(1, 2) val (x, y) = coords()
Se pasa a la función un data class con cinco campos; la desestructuración se usa con cinco variables. Con el tiempo, se añadió un campo: el patrón requiere revisar toda la lógica de análisis, apareciendo variables no utilizadas en algunos lugares.
Ventajas:
Desventajas:
La desestructuración se utiliza solo para data class con 2–3 campos (por ejemplo, coordenadas x, y), o al iterar sobre un mapa donde la estructura está garantizada y es fija.
Ventajas:
Desventajas: