Scala和转发参考
发布时间:2020-12-16 09:29:56 所属栏目:安全 来源:网络整理
导读:Possible Duplicate: 07000 object Omg { class A class B(val a: A) private val b = new B(a) private val a = new A def main(args: Array[String]) { println(b.a) }} 以下代码打
object Omg { class A class B(val a: A) private val b = new B(a) private val a = new A def main(args: Array[String]) { println(b.a) } } 以下代码打印“null”。在java中类似的构造由于无效的正向引用而不能编译。问题是 – 为什么在Scala中编译好?是按照设计,描述在SLS或简单的bug在2.9.1? 解决方法
这不是一个bug,而是学习Scala时的经典错误。当对象Omg被初始化时,所有值首先被设置为默认值(在这种情况下为null),然后运行构造函数(即对象体)。
为了使其正常工作,只需在前面引用的声明前添加懒惰关键字(在这种情况下为值a): object Omg { class A class B(val a: A) private val b = new B(a) private lazy val a = new A def main(args: Array[String]) { println(b.a) } } 值a将随后根据需要初始化。 这种结构很快(这些值只针对所有应用程序运行时初始化一次)并且线程安全。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读