Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

复杂构造函数

为了使代码正常工作,对象必须得到适当的初始化。

构造函数是一个特殊的函数,用于创建一个新的对象。在构造函数中,我们看到了只初始化其参数的简单构造函数。在参数列表中使用 varval 将这些参数变为属性,从对象外部可以访问:

// 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!"
}

即使构造函数参数没有使用 varval 标记为属性,它们仍然可以在 init 部分内部访问。

尽管定义为 val,但 content 在定义点并未初始化。在这种情况下,Kotlin 确保在构造过程中的某一时刻进行初始化。要么重新分配 content,要么忘记初始化它都会产生错误消息。

  • -

构造函数是构造函数参数列表(在进入类体之前初始化)和 init 部分(在对象创建时执行)的组合。Kotlin 允许多个 init 部分,它们按照定义的顺序执行。然而,在大型和复杂的类中,将 init 部分分散开来可能会给习惯于单个 init 部分的程序员带来维护问题。

练习和解答可以在 www.AtomicKotlin.com 找到。