复杂构造函数
为了使代码正常工作,对象必须得到适当的初始化。
构造函数是一个特殊的函数,用于创建一个新的对象。在构造函数中,我们看到了只初始化其参数的简单构造函数。在参数列表中使用 var
或 val
将这些参数变为属性,从对象外部可以访问:
// ComplexConstructors/SimpleConstructor.kt
package complexconstructors
import atomictest.eq
class Alien(val name: String)
fun main() {
val alien = Alien("Pencilvester")
alien.name eq "Pencilvester"
}
在这些情况下,我们不需要编写构造函数代码,Kotlin 会为我们自动完成。为了更多的自定义,可以在类体中添加构造函数代码。在 init
部分内部的代码会在对象创建时执行:
// ComplexConstructors/InitSection.kt
package complexconstructors
import atomictest.eq
private var counter = 0
class Message(text: String) {
private val content: String
init {
counter += 10
content = "[$counter] $text"
}
override fun toString() = content
}
fun main() {
val m1 = Message("Big ba-da boom!")
m1 eq "[10] Big ba-da boom!"
val m2 = Message("Bzzzzt!")
m2 eq "[20] Bzzzzt!"
}
即使构造函数参数没有使用 var
或 val
标记为属性,它们仍然可以在 init
部分内部访问。
尽管定义为 val
,但 content
在定义点并未初始化。在这种情况下,Kotlin 确保在构造过程中的某一时刻进行初始化。要么重新分配 content
,要么忘记初始化它都会产生错误消息。
- -
构造函数是构造函数参数列表(在进入类体之前初始化)和 init
部分(在对象创建时执行)的组合。Kotlin 允许多个 init
部分,它们按照定义的顺序执行。然而,在大型和复杂的类中,将 init
部分分散开来可能会给习惯于单个 init
部分的程序员带来维护问题。
练习和解答可以在 www.AtomicKotlin.com 找到。