kotlin - 是否可以使用私有(private)辅助构造函数在 Kotlin 中分配一个 val

我试图通过使用私有(private)构造函数来分配类字段来减少代码重复,但这似乎不可能。

我想做的是这里的例子:

class Foo {
    private val bar: Int
    private val baz: Int

    constructor(bar: Int, baz: Int) : this(baz) {
        this.bar = bar
    }

    constructor(bar: String, baz: Int) : this(baz) {
        this.bar = bar.toInt()
    }

    private constructor(baz: Int) {
        this.baz = baz
    }
}

另一种可行但我不满意的方法是执行以下操作:

class Foo {
    private val bar: Int
    private val baz: Int

    constructor(bar: Int, baz: Int) {
        this.bar = bar
        this.baz = baz
    }

    constructor(bar: String, baz: Int) {
        this.bar = bar.toInt()
        this.baz = baz
    }
}

明确地说,我对 this.baz 作业的复制不满意。

这在 Kotlin 中是不可能的,还是我遗漏了什么?

最佳答案

您应该将其重写为:

class Foo(
    private val bar: Int,
    private val baz: Int, 
) {
    constructor(bar: String, baz: Int) : this(bar.toInt(), baz)
}

(Int, Int) 构造函数已成为主构造函数,初始化所有值。第二个构造函数委托(delegate)主构造函数。

您在非工作代码中声明的前两个辅助构造函数不能重新分配 val,因为它们委托(delegate)给另一个构造函数,并且假设该构造函数初始化了所有必要的属性。尽管在这种情况下,它没有,所以你会得到另一个错误。

关于kotlin - 是否可以使用私有(private)辅助构造函数在 Kotlin 中分配一个 val?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70580796/

相关文章:

python - 如何检查整数小数点后的值是否为零

java - 错误 :Kotlin: Module was compiled with an inc

gradle - 如何在 GitHub 工作流程中重用 gradle 缓存

c - 为什么这个计算字符串长度的 C 程序会给出错误的输出?

typescript - zod:将字符串转换为数字后设置最小最大值

python - 带有 python docker 容器的 AWS Lambda 的无效入口点

c# - 循环中 Enumerable Count 方法的性能

python - 如何在句子中交替替换单词中的大小写字母? Python

python - 如何乘以一个数字直到它达到 Python 中的特定数字?

sql - 如何计算将 null 视为零的平均值