通过辅助构造函数在 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
。
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
。