に新しいです:
クラスが他の二コンストラクタ(を介して間接的に主要なコンストラクタは、プライマリコンストラクタに委任する必要が 各セカンダリコンストラクタ、直接または を持っている場合s)。 同じクラスの別のコンストラクタへの委任は、このキーワードを使用して行われます:
例:
は
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
の値。
次の2つの二次コンストラクタ持つことができます。
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
にアクセスしてみてください。
編集:データクラスには、少なくとも1つのValまたはVARとの主コンストラクタを必要とするため、
これは、データ・クラスでは不可能です。プライマリコンストラクタがある場合は、セカンダリコンストラクタもプライマリコンストラクタに委譲する必要があります。おそらく、すべてのプロパティをデータクラスの単一の主コンストラクタに入れることができますが、null可能なプロパティを持つことができます。または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