为什么kotlin在数据类中具有componentN函数,如果他们已经有getter和setter?

在kotlin中有一个数据类,例如

@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。 在这种情况下,componentN函数是多余的,为什么我们需要它们?因为getter似乎更加不言自明?

Kotlin通过componentN函数支持以下语法:

 val (name, age) = person 

这个语法被称为解构声明 。 解构声明一次创建多个变量。 我们已经宣布了两个新的变量:名字和年龄。

解构声明被编译成以下代码:

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

component1()和component2()函数是在Kotlin中广泛使用的约定原则的另一个例子(请参阅+和*,for-loops等运算符)。 任何东西都可以放在解构声明的右边,只要可以调用所需数量的组件函数即可。 当然,可以有component3()和component4()等等。

请注意,componentN()函数需要使用运算符关键字标记,以允许在解构声明中使用它们。