Kotlin 错误 - 委托调用链中存在循环

Ano*_*die 7 android constructor kotlin

我有一个 Kotlin 数据类,它采用如下参数并且可打包。我在此数据类中定义了一个辅助构造函数,其中包含两个附加参数 lastSeen 和 netTotal。但是,我不断收到错误辅助构造函数的委托调用链中有一个循环。我该如何解决这个问题?

@Parcelize
data class Person(
    val email: Email,
    val overrideEmail: Email,
    val phone: String,
    val firstName: String,
    val overrideFirstName: String,
    val lastName: String,
    val overrideLastName: String,
    val personId: String
) : Parcelable {

    //some code

    constructor(
    email: Email,
    overrideEmail: Email,
    phone: String,
    firstName: String,
    overrideFirstName: String,
    lastName: String,
    overrideLastName: String,
    personId: String,
    lastSeen: String,
    netTotal: Int?
) : this(email, overrideEmail, phone, firstName, overrideFirstName, lastName, overrideLastName, personId, lastSeen, netTotal)

}
Run Code Online (Sandbox Code Playgroud)

此外,我必须在响应映射器中使用这个辅助构造函数。具有原始值的映射器如下所示。如何在我的响应映射器中包含辅助构造函数?

class PersonFromResponseMapper @Inject constructor() : Mapper<Person, PersonResponse>() {
override fun map(from: PersonResponse, params: Any?): Person = with(from) {
    Person(
        Email(receiptEmailAddress.orEmpty()),
        Email(overrideEmail.orEmpty()),
        "",
        firstName.orEmpty(),
        overrideFirstName.orEmpty(),
        lastName.orEmpty(),
        overrideLastName.orEmpty(),
        personUserId.orEmpty()
    )
}
Run Code Online (Sandbox Code Playgroud)

mlt*_*chr 7

您收到此错误是因为您正在使用辅助构造函数调用辅助构造函数,从而使其成为一个循环。如果你稍微重构/美化你的代码,那么它就变得显而易见:

// secondary constructor
constructor(
    email: Email,
    overrideEmail: Email,
    phone: String,
    firstName: String,
    overrideFirstName: String,
    lastName: String,
    overrideLastName: String,
    personId: String,
    lastSeen: String,
    netTotal: Int?
) : this(
    email, 
    overrideEmail, 
    phone, 
    firstName, 
    overrideFirstName, 
    lastName, 
    overrideLastName, 
    personId, 
    lastSeen, 
    netTotal
)
Run Code Online (Sandbox Code Playgroud)

如果比较参数,您可以看到您正在调用相同的(辅助)构造函数。您必须调用主构造函数并随后在块中使用附加参数。

如果解决了该问题,您还可以在映射器中调用辅助构造函数,不会出现任何问题。