Kotlin 在调用主构造函数之前如何运行代码?

Kotlin 在调用主构造函数之前如何运行代码?,kotlin,Kotlin,我正在编写一个包含两个不可变值的类,它们在主构造函数中设置。我想添加一个二级构造函数,它接受一个字符串并解析它以获得这两个值。但是,我无法找到在Kotlin中实现这一点的方法,因为在解析字符串之前,辅助构造函数会立即调用主构造函数 在java中,我会在另一个构造函数中调用this(a,b),但java没有主构造函数。如何添加此功能 class Object (a: double, b:double) { val a = a val b = b constructor(str: Str

我正在编写一个包含两个不可变值的类,它们在主构造函数中设置。我想添加一个二级构造函数,它接受一个字符串并解析它以获得这两个值。但是,我无法找到在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
  }
}

您可以使用工厂方法替换解析构造函数:

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
    }
}

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.fromscoordinates(coordinates:Pair)
等等


直到最近,Kotlin才允许使用二级构造函数。

您就快到了
constructor(str:String):这个(parseFn(str).a,parseFn(str).b)
将起作用,假设parseFn返回一个带有a和b访问器的类。我认为您不能在二级结构中有代码块constructor@user1713450,我考虑了您的第一个选项,但对两个值同时进行解析,因此需要调用它两次。虽然它完成了任务,但奇怪的是没有更好的了。请参阅下面我的答案,关于二级构造函数不受欢迎,因为它们导致代码可读性较差。工厂方法要好得多,这是我的建议(我就是这么做的)。你经常在谷歌的官方Android代码中看到这一点。许多组件都有一个
伴生对象{funNewInstance(/*params*):组件实例{/*code来生成它*/}
键入代码,特别是用于创建新的视图组件,如片段和活动。如果有一堆构造函数,您的代码完成将开始抛出难以使用的建议。我尝试了后者,它告诉我构造函数中的“Val不能重新分配”和“属性必须初始化或抽象”在字段定义中。@BillThePlatypus,您确定已完全删除主构造函数,并且类名后没有括号吗?是的,类名后没有括号name@BillThePlatypus,我使用的是Kotlin JVM v.1.3.61,它是。