在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; } }
但在次要的构造函数行上说,主构造函数是必需的。 我知道一些代表团是必需的,在那里调用主构造器的forms。 我不能从这里调用主构造函数。 如果我正在做一些愚蠢的错误,我很抱歉。 我对这件事很陌生
从文档 :
如果类具有主构造函数,则每个次构造函数都需要通过另一个辅助构造函数直接或间接地委托给主构造函数。 使用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; }
但它看起来不像在secondary构造函数中有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
将不会被初始化,如果您尝试访问centerId
,则会发生exception( centerId
。
编辑:
这在数据类中是不可能的,因为数据类需要一个至少有一个val或var的主构造函数。 如果你有主构造函数,那么你的次构造函数也应该委托给主构造函数。 也许你可以在数据类的一个主要构造函数中拥有所有的属性,但是可以使用空属性。 或者看看Sealed class
。
sealed class InstituteSearchDetails { data class InstituteWithCenterId(val centerId: String): InstituteSearchDetails() data class InstituteWithNameAndCity(val name: String, val city: String): InstituteSearchDetails() } fun handleInstitute(instituteSearchDetails: InstituteSearchDetails) { when (instituteSearchDetails) { is InstituteSearchDetails.InstituteWithCenterId -> println(instituteSearchDetails.centerId) is InstituteSearchDetails.InstituteWithNameAndCity -> println(instituteSearchDetails.name) } }