在不使用延迟val的情况下避免特征初始化中的NPE

时间:2012-09-28 21:00:44

标签: scala nullpointerexception

这可能是Jesse Eichar的blog entry所涵盖的 - 我仍然无法弄清楚如何纠正以下而不诉诸懒惰的vals 以便NPE得到修复:< / p>

鉴于

trait FooLike { def foo: String }
case class Foo(foo: String) extends FooLike

trait Sys {
  type D <: FooLike
  def bar: D
}

trait Confluent extends Sys {
  type D = Foo
}

trait Mixin extends Sys {
  val global = bar.foo
}

首次尝试:

class System1 extends Mixin with Confluent {
  val bar = Foo("npe")
}

new System1  // boom!!

第二次尝试,改变mixin顺序

class System2 extends Confluent with Mixin {
  val bar = Foo("npe")
}

new System2  // boom!!

现在我非常重视barglobal,因此我不想因为Scala(2.9.2)无法正确初始化而支付懒惰税。怎么办?

1 个答案:

答案 0 :(得分:11)

您可以使用early initializer

class System1 extends {
  val bar = Foo("npe")
} with Mixin with Confluent {
  // ...
}

scala> new System1
res3: System1 = System1@1d0bfedd