我有以下类:
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编译器不允许这样做吗?
4条答案
按热度按时间uqzxnwby1#
Kotlin中的参数永远是不可变的。将构造函数参数标记为
val
会将其转换为类的属性,而这只能在主构造函数中完成,因为类的属性集不能根据用于创建类示例的构造函数而变化。izj3ouym2#
除了yole的出色回答之外,documentation也非常明确:
注意,主构造函数的参数可以用在初始化器块中,也可以用在类体中声明的属性初始化器中。[......]事实上,对于从主构造函数声明属性并初始化它们,Kotlin有一个简洁的语法:
与常规属性非常相似,在主构造函数中声明的属性可以是可变的(var)或只读的(瓦尔)。
这些都不适用于次要构造函数。
0yycz8jy3#
可以在继承自的类中将变量定义为瓦尔或var
c0vxltue4#
目前公认的答案正确地解释了为什么你最初的尝试没有成功。因此,考虑到你的特定场景,我将逆解,使你的次要构造函数成为主要构造函数,并使第二个参数具有默认值。
此外,如果类的目的只是保存数据,我会将其设置为
data class
以改进其处理。