正如科特林参考文献Classes and Inheritance所说,
如果类具有主要构造函数,则每个次要构造函数都需要直接或间接通过另一个次要构造函数委派给主要构造函数。
我不明白为什么Kotlin二级构造函数需要这样做?可以防止Java中出现一些问题吗?
答案 0 :(得分:3)
这是因为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
块均使用主要构造函数参数-如果次要构造函数未调用主要构造函数,则无法执行初始化。
调用主构造函数时,width
和height
属性也被隐式初始化-再次,如果次要构造函数没有调用主构造函数,则这些属性将保持未初始化状态。
当然,如果没有主构造函数,则您可以在一个类中具有多个辅助构造函数(例如,对于Android Views来说很常见)-如果有初始化逻辑,您将很难。