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

Initialize val property on Kotlin Data Class via Secondary constructor

class Animal {
    val name: String

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

对于 Kotlin 中的上述 class 我可以通过 辅助构造函数 val 属性 初始化 val 属性 =22=] 但同样不允许 Data classes

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
    }

}

我不明白的是,电子邮件 属性 在哪里已经初始化了,因为我还没有声明任何初始化?

如果您的 class 有一个主构造函数,您 必须 初始化它的所有属性 "in the primary constructor" - 通过在它们的声明中直接初始化它们:

val email = "foo@bar.com"

或者在初始化块中:

val email: String

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

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