我是Kotlin的新手。我想写一个包含数据的类。我想要两个构造函数。我想要的是这样的东西
class InstituteSearchDetails (var centerId: String) {
lateinit var centerId: String;
lateinit var instituteName: String;
lateinit var city: String;
init {
this.centerId=centerId
}
constructor( instituteName: String, city: String)
{
this.instituteName=instituteName;
this.city=city;
}
}
但是在Secondary构造函数行上,它表示需要进行主构造函数调用。我知道需要一些委托,在那里调用主构造函数表单。我不能从这里调用主要构造函数。如果我犯了一些愚蠢的错误,我很抱歉。我是这个东西的新手
答案 0 :(得分:3)
来自doc:
如果类具有主构造函数,则每个辅助构造函数 需要直接或者委托给主构造函数 间接通过另一个辅助构造函数。代表团 使用this关键字完成同一个类的另一个构造函数:
示例:
class Person(val name: String) {
constructor(name: String, parent: Person) : this(name) {
parent.children.add(this)
}
}
您的代码:
constructor( instituteName: String, city: String) : this("centerId"){
this.instituteName=instituteName;
this.city=city;
}
但是看起来你的辅助构造函数中没有centerId
值。
您可以拥有两个辅助构造函数:
class InstituteSearchDetails {
lateinit var centerId: String;
lateinit var instituteName: String;
lateinit var city: String;
constructor(centerId: String) {
this.centerId = centerId
}
constructor( instituteName: String, city: String)
{
this.instituteName=instituteName;
this.city=city;
}
}
但请注意,例如,如果您使用第二个构造函数,则centerId
将不会被初始化,如果您尝试访问{{1,您将获得异常(UninitializedPropertyAccessException
)在那种情况下。
编辑:
这在数据类中是不可能的,因为数据类需要具有至少一个val或var的主构造函数。如果您有主构造函数,那么您的辅助构造函数也应该委托给主构造函数。也许您可以将所有属性放在数据类的单个主构造函数中,但具有可为空的属性。或者查看Sealed class
。
centerId