首页 > 解决方案 > 通过辅助构造函数初始化 Kotlin 数据类的 val 属性

问题描述

class Animal {
    val name: String

    constructor(name: String){
        this.name = name // initialized via constructor
    }
}

对于上面的类,Kotlin我可以通过辅助构造函数初始化val属性,但Data 类不允许这样做

data class User(val name: String, val postalCode: Int) {
    val email: String

    constructor( email: String): this("", 1){
        this.email = email // error: value can not be reassigned
    }

}

我无法理解的是,电子邮件属性在哪里已经初始化,因为我没有声明任何初始化?

标签: kotlindata-class

解决方案


如果你的类有一个主构造函数,你必须“在主构造函数中”初始化它的所有属性——或者在它们的声明中直接初始化它们:

val email = "foo@bar.com"

或者在初始化块中:

val email: String

init {
    email = "foo@bar.com"
}

编译器强制您将所有辅助构造函数调用转发给主构造函数,并且由于主构造函数已经必须初始化类内的所有属性(否则调用它会构造一个部分初始化的实例,就像在您的代码示例中一样),它在辅助构造函数的主体中也初始化它们是没有意义的,尤其是对于val不能重新分配的 a 。


推荐阅读