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

hum*_*lue 2 constructor field kotlin

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

我想做的是这里的例子:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

需要明确的是,我对作业的重复并不满意this.baz

这在 Kotlin 中根本不可能,还是我错过了什么?

Swe*_*per 9

您应该将其重写为:

class Foo(
    private val bar: Int,
    private val baz: Int, 
) {
    constructor(bar: String, baz: Int) : this(bar.toInt(), baz)
}
Run Code Online (Sandbox Code Playgroud)

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

您在非工作代码中声明的前两个辅助构造函数无法重新分配 s val,因为它们委托给另一个构造函数,并且假定该构造函数初始化了所有必要的属性。但在本例中,情况并非如此,因此您会收到另一个错误。