加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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) }} 以下代码打

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)
  }

}

以下代码打印“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将随后根据需要初始化。

这种结构很快(这些值只针对所有应用程序运行时初始化一次)并且线程安全。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读