Kotlin数据类辅助构造函数初始化块

Kotlin数据类辅助构造函数初始化块,kotlin,constructor,Kotlin,Constructor,假设我们有一个具有两个属性的数据类,出于某些原因,我们需要二级构造函数。问题是我需要重新计算主构造函数调用中的每个参数,而不是使用一些缓存的raw.split(“”): 我可以用Java来做这件事,但我如何用Kotlin来做呢?你可以这样做: 数据类Id( val arg1:字符串, val arg2:字符串 ) { 私有构造函数(拆分:列表):此(拆分[0],拆分[1]) 构造函数(raw:String):这个(raw.split(“”)) } 这是一个很好的解决问题的惯用方法。因为所有的二

假设我们有一个具有两个属性的数据类,出于某些原因,我们需要二级构造函数。问题是我需要重新计算主构造函数调用中的每个参数,而不是使用一些缓存的
raw.split(“”)


我可以用Java来做这件事,但我如何用Kotlin来做呢?

你可以这样做:

数据类Id(
val arg1:字符串,
val arg2:字符串
) {
私有构造函数(拆分:列表):此(拆分[0],拆分[1])
构造函数(raw:String):这个(raw.split(“”))
}

这是一个很好的解决问题的惯用方法。因为所有的二级构造函数都必须委托给主构造函数(数据类总是这样),所以您不能在构造函数体中做您想要做的事情。在Java中,它之所以有效,是因为在语言级别上没有主构造函数,也没有数据类——在Kotlin中,如果删除
data
修饰符并将属性移到构造函数之外,您也可以像在Java中那样做,但这是一种非常糟糕的方法。

我知道Kotlin中的主构造函数和数据类限制。我认为Kotlin对您上面展示的代码有一些语法甜点,因为它有一点味道——计算没有封装在构造函数方法中(因为在构造函数创建=>类作用域之间阻塞)。但无论如何,它解决了问题!谢谢!
data class Id(
    val arg1: String,
    val arg2: String
) {
    constructor(raw: String) : this(raw.split("_")[0], raw.split("_")[1])
}