是否可以使用私有辅助构造函数在 Kotlin 中分配一个 val?

Is it possible to use a private secondary constructor to assign a val in Kotlin?

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

我想做的就是这里的例子:

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)构造函数已经成为主构造函数,初始化所有值。第二个构造函数委托主构造函数。

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

这行不通,因为您的私有构造函数无法初始化所有属性。您将其视为简单的函数调用。

为什么不这样做?

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.toInt(), baz) 
}