为什么在 Kotlin 中每个次要构造函数都需要委托给主构造函数?

4
根据Kotlin参考文档类和继承所述,
如果类有一个主构造函数,每个次构造函数都需要直接或间接地通过另一个次构造函数将委托传递给主构造函数。
我不明白为什么Kotlin的次构造函数需要这样做?这是为了防止Java中出现一些问题吗?
1个回答

7
这是因为init块和属性初始化程序始终需要正确运行以构造类的实例,并且它们可能依赖于传递给主构造函数的属性来进行初始化 - 这就是主构造函数为您提供的便利(以及能够在类标题中直接拥有属性的能力)。
例如,考虑以下类:
class Rectangle(val width: Int, val height: Int) {

    constructor(size: Int) : this(size, size)

    val area = width * height

    init {
        println("New rectangle, $width x $height")
    }

}

area属性和init块都使用主构造函数参数 - 如果辅助构造函数没有调用主构造函数,就无法进行初始化。

当调用主构造函数时,widthheight属性也会被隐式初始化 - 如果辅助构造函数没有调用主构造函数,这些属性将保持未初始化状态。

当然,如果一个类没有主构造函数(例如 Android Views),你可以有多个辅助构造函数 - 只是在执行任何初始化逻辑时会更加困难。


可能是因为初始化块只能有共享的初始化逻辑,如果类有一个主构造函数和多个次要构造函数。对吗? - Ryanqy
是的,这是必需的,以便它们能够访问构造函数的参数(即主要构造函数)。 - zsmb13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接