我有以下课程:
class Person(val name: String) {
private var surname: String = "Unknown"
constructor(name: String, surname: String) : this(name) {
this.surname = surname
}
}
但是当我想在第二个构造函数中使 name 参数不可变时:
constructor(val name: String, surname: String) : this(name) {
this.surname = surname
}
我有以下编译时错误:
Kotlin:不允许在辅助构造函数参数上使用'val'
有人可以解释为什么Kotlin编译器不允许这样做吗?
答案 0 :(得分:21)
Kotlin中的参数总是不可变的。将构造函数参数标记为val
会将其转换为类的属性,这只能在主构造函数中完成,因为类的属性集不能根据用于创建实例的构造函数而变化该课程。
答案 1 :(得分:3)
除yole的优秀答案外,documentation也非常明确:
请注意,主构造函数的参数可以在初始化程序块中使用。它们也可以在类体中声明的属性初始值设定项中使用。 [...]事实上,为了声明属性并从主构造函数初始化它们,Kotlin有一个简洁的语法:
class Person(val firstName: String, val lastName: String, var age: Int) {
// ...
}
与常规属性大致相同,主构造函数中声明的属性可以是可变的(var)或只读的(val)。
这一切都不适用于辅助构造函数。