從doc:
如果類有一個主構造, 需要委託給主構造每個次級構造,無論是直接或 間接通過其他次級構造( S)。代表團 同一類的其他構造函數中使用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
就不會被如果使用第二個構造函數初始化,你會得到,如果你一個異常(UninitializedPropertyAccessException
)在這種情況下嘗試訪問centerId
。
編輯:
這不是在數據類可能的,因爲數據類需要與至少一個VAL或變種的主要構造。如果你有主構造函數,那麼你的次構造函數也應該委託給主構造函數。也許你可以在數據類的一個主要構造函數中擁有所有的屬性,但是可以使用空屬性。或者參見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)
}
}
來源
2017-08-24 13:07:23
Bob
是的我沒有centerId值在二級構造函數。那就是問題所在。 – FaisalAhmed
更新了答案 – Bob
我可以做與數據類相同嗎? – FaisalAhmed