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

时间:2017-04-01 15:47:51

标签: kotlin

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似乎更加不言自明?

1 个答案:

答案 0 :(得分:16)

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

val (name, age) = person 

此语法称为destructuring declaration。解构声明一次创建多个变量。我们已经声明了两个新变量:name和age。

解构声明编译为以下代码:

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

component1()和component2()函数是另一个例子   Kotlin中广泛使用的惯例原则(见+等运营商)   和*,for-loops等)。任何东西都可以在a的右边   解构声明,只要所需的组件数量   可以在其上调用函数。当然,也可以   component3()和component4()等等。

     

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