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

除非打印,否则Scala :: lazy值为null?

发布时间:2020-12-16 18:38:10 所属栏目:安全 来源:网络整理
导读:鉴于特点(简化) trait A { val eventStream: EventStream val credentialsStorage = // something here val userStorage = // something here val crypto = // something here ... lazy val authSvc = new CoreAuthentication(credentialsStorage,new Authen
鉴于特点(简化)

trait A {
  val eventStream: EventStream
  val credentialsStorage = // something here
  val userStorage = // something here
  val crypto = // something here
  ...    
  lazy val authSvc = new CoreAuthentication(credentialsStorage,new AuthenticationProviderResolver,userStorage,eventStream,crypto)
}

class T extends A with TraitProvidingEventStream with FlatSpec with [lot of another traits here] {

  val eventStream = systemFromTraitProvidingEventStream.eventStream

  "This" should "work" in {
    println(authSvc) // this is "magic"
    val user = authSvc.doSomethingWithUser(...);
  }
}

如果我删除标记为//这是“魔术”的行,那么我将在下一行获得NullPointerException,因此authSvc为null.

那可能有什么问题?

我无法为此创建干净的小测试用例,通常这种方法效果很好

解决方法

这在ML上出现一次:如果在初始化惰性val时抛出异常,则val为null;但你可以尝试再次尝试,它可以神奇地工作. (也就是说,在第一次尝试初始化失败时,没有设置延迟val的“初始化”位标志.)

我认为ML上的情况与特征中的val的初始顺序有关,所以也许这就是你的问题.依靠它是非常危险的,因此建议在特质中使用defs.请参阅Luigi对DelayedInit的评论.

(编辑:李大同)

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

    推荐文章
      热点阅读