数据类构造函数在Kotlin中有两个不同的构造函数

时间:2017-08-24 13:03:26

标签: kotlin

我是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构造函数行上,它表示需要进行主构造函数调用。我知道需要一些委托,在那里调用主构造函数表单。我不能从这里调用主要构造函数。如果我犯了一些愚蠢的错误,我很抱歉。我是这个东西的新手

1 个答案:

答案 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