Scala中的初始化顺序

时间:2019-04-02 14:56:21

标签: scala

具有随同对象的Scala类

object BB {
    val time = System.currentTimeMillis()
}

class BB {
    val time = System.currentTimeMillis()
}

我想知道对象是否像Java中那样工作,如果我记得在类中首先要评估的是静态变量,最后是构造函数。

但是在这里,当我创建一个新的BB实例并检查时间时,它不是首先评估的对象。

object main extends App {
    val time = System.currentTimeMillis()
    private val bb = new BB

    println(s"App:$time ")
    println("Instance" + bb.time )
    println(s"Static ${BB.time }")
}

那么我一直想知道Scala中的初始化如何工作?

致谢。

1 个答案:

答案 0 :(得分:4)

如注释中所述,伴随对象在首次访问时被初始化。更广泛地说,Scala中的所有object都是延迟初始化的。引用the Scala Language Specification(对于2.12版):

  

请注意,对象定义所定义的值是延迟实例化的。新的 m $ cls 构造函数不会在对象定义时进行评估,而是在程序执行期间首次取消引用 m 时进行评估。根本没有。)

您可以通过一些实验来确认(我将使用Iterator而不是System.currentTimeMillis,以便可以轻松地托管它并在Scastie上运行):< / p>

val ticks = Iterator.from(0)

object BB {
  val time = ticks.next()
  val foo = "bar"
}

class BB {
  val time = ticks.next()
}

new BB().time
new BB().time
BB.foo
new BB().time
BB.time

最后五个表达式将在访问BB成员时foo(对象)被初始化,最后一个表达式的值为2。

如前所述,您可以使用此代码on Scastie