通过辅助构造函数在Kotlin数据类上初始化val属性

时间:2018-09-01 06:41:49

标签: kotlin data-class

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
    }

}

我不明白的是,由于未声明任何初始化,电子邮件属性已经在哪里初始化?

1 个答案:

答案 0 :(得分:7)

如果您的类具有主构造函数,则必须在“主构造函数”中初始化其所有属性-通过在声明时直接对其进行初始化:

val email = "foo@bar.com"

或在初始化程序块中:

val email: String

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

编译器会强制您将所有辅助构造函数调用转发给到主要构造函数,并且由于主要构造函数已经必须初始化类中的所有属性(否则调用它会构造部分初始化的实例,如您的代码示例中所示) ),也没有必要在辅助构造函数的主体中对其进行初始化,尤其是对于无法重新分配的val