具有随同对象的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中的初始化如何工作?
致谢。
答案 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。