是否可以使用私有辅助构造函数在 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)
}
我试图通过使用私有构造函数分配一个 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)
}