Почему у kotlin есть функции componentN в классе данных, если у них уже есть геттеры и сеттеры?

В Котлине есть класс данных, например

@Entity data class Record( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long? = null, @Column(nullable = false, name = "name") var name: String? = null ) 

И я могу вызвать функции component1 и component2 для доступа к свойствам. Однако, когда я объявляю свойство var, у меня есть getter и setter, и если я объявляю свойство val, у меня есть getter. В этом случае функции ComponN избыточны и почему они нам нужны, потому что геттеры кажутся гораздо более понятными?

Kotlin поддерживает следующий синтаксис через функции componentN :

 val (name, age) = person 

Этот синтаксис называется объявлением деструкции . Объявление деструкции создает сразу несколько переменных. Мы объявили две новые переменные: имя и возраст.

Объявление деструктуризации скомпилировано до следующего кода:

 val name = person.component1() val age = person.component2() 

функции component1 () и component2 () являются еще одним примером принципа широко используемых конвенций в Котлине (см. операторы типа + и *, for-loops и т. д.). Все, что угодно, может быть в правой части объявления деструктуризации, если на нем можно вызвать необходимое количество функций компонента. И, конечно же, могут быть компоненты3 () и component4 () и т. Д.

Обратите внимание, что функции componentN () должны быть помечены ключевым словом оператора, чтобы разрешить их использование в объявлении деструкции.