我正在编写一个包含两个不可变值的类,这些值在主构造函数中设置。我想添加一个辅助构造函数,该结构接受一个字符串并对其进行解析以获取这两个值。但是,我无法在Kotlin中找到实现此目的的方法,因为辅助构造函数在解析字符串之前会立即调用主要构造函数。
在Java中,我会在其他构造函数之一中调用this(a,b)
,但是Java没有主要的构造函数。如何添加此功能?
class Object (a: double, b:double)
{
val a = a
val b = b
constructor(str: String) //Parsing constructor
{
//Do parsing
a = parsed_a
b = parsed_b
}
}
答案 0 :(得分:1)
您可以使用工厂方法替换解析构造函数:
class Object(val a: Double, val b: Double) {
companion object {
// this method invocation looks like constructor invocation
operator fun invoke(str: String): Object {
// do parsing
return Object(parsed_a, parsed_b)
}
}
}
或将两个构造函数都设为次要:
class Object {
val a: Double
val b: Double
constructor(a: Double, b: Double) {
this.a = a
this.b = b
}
// parsing constructor
constructor(str: String) {
// do parsing
a = parsed_a
b = parsed_b
}
}
答案 1 :(得分:1)
Kotlin不赞成使用辅助构造函数。最好的解决方案是使用工厂方法。参见,例如:
class A(val a: Int, val b: Int) {
companion object {
fun fromString(str: String): A {
val (foo, bar) = Pair(1, 2) // sub with your parsing stuff
return A(foo, bar)
}
}
}
这将导致更具可读性的代码。想象一下,有十个不同的构造函数的类除了MyClass
之外没有其他方法,而工厂方法支持的更明显的方法是MyClass.fromString(str: String)
和MyClass.fromCoordinates(coordinates: Pair<Int, Int>)
等等。
直到最近才在Kotlin中不允许二级构造函数。