Kotlin 数据类二级构造函数初始化 block

标签 kotlin constructor

假设我们有具有两个属性的数据类,并且出于某些原因我们需要辅助构造函数。问题是我需要重新计算主构造函数调用中的每个参数,而不是使用 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/

相关文章:

java - Firebase token 生成器在 APN 中失败

generics - Kotlin声明签名冲突?

android - 如何以编程方式显示/隐藏 BottomAppBar?

python - 初始化器与构造器

c++ - move 具有常量数据成员或引用成员的类的构造函数

c++ - 将数组从 C++ 构造函数传递给函数

c++ - 将类的 vector 写入文件的方法

java - Android MANAGE_EXTERNAL_STORAGE 权限被 Google Playstore 拒绝用于社交网络应用

android - 使用 Jetpack Compose 时如何更好地注入(inject) ViewModel 对象?

java - Spring——跳过此测试的飞路