假设我们有具有两个属性的数据类,并且出于某些原因我们需要辅助构造函数。问题是我需要重新计算主构造函数调用中的每个参数,而不是使用 raw.split("_")
的一些缓存值:
data class Id(
val arg1: String,
val arg2: String
) {
constructor(raw: String) : this(raw.split("_")[0], raw.split("_")[1])
}
我可以在 Java 中做到这一点,但我如何在 Kotlin 中做到这一点?
最佳答案
你可以这样做:
data class Id(
val arg1: String,
val arg2: String
) {
private constructor(splitted: List<String>) : this(splitted[0], splitted[1])
constructor(raw: String) : this(raw.split("_"))
}
这是解决问题的好方法。由于所有辅助构造函数都必须委托(delegate)给主构造函数(数据类总是有它),所以你不能在构造函数体中做你想做的事情。在 Java 中它可以工作,因为在语言级别没有主构造函数和数据类 - 在 Kotlin 中,如果您删除
data
,您也可以像在 Java 中一样执行此操作。在构造函数之外修改和移动属性,但这是一个非常糟糕的方法。
关于Kotlin 数据类二级构造函数初始化 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59959101/