簡體   English   中英

在Kotlin中具有兩個不同構造函數的數據類構造函數

[英]Data class constructor with two different constructor in 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;

}
}

但是在次要構造函數行中,它表示需要主要構造函數調用。 我知道需要一些委托來在那里調用主要構造函數形式。 我不能從這里調用主構造函數。 對不起,如果我犯了一些愚蠢的錯誤。 我是這個東西的新手

文檔

如果類具有主要構造函數,則每個次要構造函數都需要直接或間接通過另一個次要構造函數委托給主要構造函數。 使用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或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)
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM