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
}
}
我不明白的是,由于未声明任何初始化,电子邮件属性已经在哪里初始化?
答案 0 :(得分:7)
如果您的类具有主构造函数,则必须在“主构造函数”中初始化其所有属性-通过在声明时直接对其进行初始化:
val email = "foo@bar.com"
或在初始化程序块中:
val email: String
init {
email = "foo@bar.com"
}
编译器会强制您将所有辅助构造函数调用转发给到主要构造函数,并且由于主要构造函数已经必须初始化类中的所有属性(否则调用它会构造部分初始化的实例,如您的代码示例中所示) ),也没有必要在辅助构造函数的主体中对其进行初始化,尤其是对于无法重新分配的val
。