【问题标题】:Why does kotlin have componentN functions in data class, if they already have getters and setters?如果 kotlin 已经有 getter 和 setter,为什么在数据类中有 componentN 函数?
【发布时间】:2017-04-01 15:47:50
【问题描述】:

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


    【解决方案1】:

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

    val (name, age) = person 
    

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

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

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

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

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

    【讨论】:

    • 所以,是的,解构很酷。但问题仍然存在。为什么 kotlin 编译器生成 componentN 方法而不是仅仅使用 getter?如果您查看反编译的 kotlin 字节码,您会注意到 componentN 方法和 getter 完全相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多