Destructuring declarations позволяют "раскладывать" объект на переменные прямо в объявлении, что делает код лаконичным. Исторически в Java и других языках требовалось писать отдельный геттер для каждого компонента, что делало синтаксис громоздким. Kotlin ввёл специальные componentN() методы для поддержки разложения (destructuring).
Проблема: Неудобно вручную получать части составного объекта — надо много присваивать, код теряет читаемость.
Решение: data class при компиляции автоматически получает методы componentN(), которые позволяют использовать destructuring декларации для получения значений свойств.
Пример кода:
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
Ключевые особенности:
Сколько переменных можно получить через destructuring declaration?
Столько, сколько определено методов componentN() в классе. Для data class автоматически создаются для всех свойств primary constructor (до 255).
Работает ли destructuring с обычными (не data) классами?
Только если в классе объявлены методы componentN() вручную.
Пример:
class Point(val x: Int, val y: Int) { operator fun component1() = x operator fun component2() = y } val (x, y) = Point(10, 20)
Можно ли пропускать значения в destructuring declaration?
Да, используйте _ (знак подчёркивания) для пропуска внешних переменных.
val (_, onlyAge) = user
Негативный кейс
В проекте разработчик пытался использовать destructuring для обычного класса без методов componentN(), что приводило к ошибке компиляции, после чего добавлял их вручную для очень большого класса (10+ свойств).
Плюсы:
Минусы:
Позитивный кейс
Использование data class с ограниченным числом параметров (например, Result(val data: T, val error: Throwable?)), с лаконичным destructuring declaration при обработке ответа в API.
Плюсы:
Минусы: