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)
}

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

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()
)
}

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

// 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
)

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

如果你解决了这个问题,你也可以在映射器中调用你的二级构造函数,不会有任何问题。

尝试从辅助构造函数中删除最后两个参数

@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)
}

这是因为在主构造函数和辅助构造函数中定义的参数是相同的

@Parcelize
data class Person(): Parceble{
var email: Email
var overrideEmail: Email
var phone: String
var firstName: String
var overrideFirstName: String
var lastName: String
var overrideLastName: String
var personId: String
var lastSeen: String
var netTotal: Int?
//First constructor
constructor(
email: Email,
overrideEmail: Email,
phone: String,
firstName: String,
overrideFirstName: String,
lastName: String,
overrideLastName: String,
personId: String
) : this(){
this.email = email
this.overrideEmail = overrideEmail
this.phone = phone
this.firstName = firstName
this.overrideFirstName = overrideFirstName
this.lastName = lastName
this.overrideLastName = overrideLastName
this.personId = personId
}
//second constructor
constructor(
email: Email,
overrideEmail: Email,
phone: String,
firstName: String,
overrideFirstName: String,
lastName: String,
overrideLastName: String,
personId: String,
lastSeen: String,
netTotal: Int?
) : this(){
this.email = email
this.overrideEmail = overrideEmail
this.phone = phone
this.firstName = firstName
this.overrideFirstName = overrideFirstName
this.lastName = lastName
this.overrideLastName = overrideLastName
this.personId = personId
this.lastSeen = lastSeen
this.netTotal = netTotal
}
}

在我的情况下,我忘记了declare a Primary Constructor。😅

有人可能会看到这条评论,
请检查您是否清楚、正确地声明了主构造函数。

最新更新