延迟特质初始化

0__*_*0__ 5 constructor scala initialization traits

我需要一个智能的组件组合机制,它允许混合特性在组合组件之后初始化.以下是NullPointerException:

class Component {
  def addListener(pf: PartialFunction[Any, Unit]) {}
}

trait DynamicComponent {
  protected def component: Component

  component.addListener {
    case x =>
  }
}

class Foo extends DynamicComponent {
  protected val component = new Component
}

new Foo  // -> NullPointerException
Run Code Online (Sandbox Code Playgroud)

以下内容对我来说不是选项:

  • 使用protected lazy val component; 这会产生几十个需要变得懒惰的val,这是我不想要的.
  • addListener在一个方法中,例如initDynamic(); 因为我会混合很多特质,我不想记得打电话给六种initFoo()方法.
  • DelayedInit.这不适用于特征,至少根据scaladocs.

我可以接一个init()电话,但只能在以下条件下:

  • 在这一个单一的调用中,所有混合的特征都可以很容易地声明被调用
  • 忘记该init()语句是一个编译错误.

Mar*_*ing 10

您可以通过使用早期定义来延迟特征的初始化.(参见scala语言规范的 5.1.6节)

class Foo extends {
  protected val component = new Component
} with DynamicComponent
Run Code Online (Sandbox Code Playgroud)