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

lop*_*hen 6 kotlin

kotlin中有一个数据类,例如

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

我可以调用component1和component2函数来访问属性.但是,当我声明属性var时,我有getter和setter,如果我声明属性val,我有getter.在这种情况下,componentN函数是多余的,为什么我们需要它们,因为getter似乎更加不言自明?

Yoa*_*erg 18

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

val (name, age) = person 
Run Code Online (Sandbox Code Playgroud)

此语法称为解构声明.解构声明一次创建多个变量.我们已经声明了两个新变量:名称和年龄.

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

val name = person.component1()
val age = person.component2()
Run Code Online (Sandbox Code Playgroud)

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

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

  • 所以,是的,解构很酷。但问题仍然存在。为什么 kotlin 编译器生成 `componentN` 方法而不是仅仅使用 getter?如果您查看反编译的 kotlin 字节码,您会发现“componentN”方法和 getter 完全相同。 (2认同)