scala - 延迟特征初始化

标签 scala constructor 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

以下事情不是我的选择:
  • 使用 protected lazy val component ;这将产生 avalange 几十个需要变得懒惰的 vals,某事 我不要 .
  • 推杆 addListener在一种方法中,例如initDynamic() ;因为我会混入很多特质,而且我不想记得给六个人打电话 initFoo()方法。
  • 使用 DelayedInit .这不适用于特征,至少根据 scaladocs。

  • 我可以住一个init()调用,但仅限于以下条件:
  • 所有混合的特征都可以很容易地声明在这一次调用中被调用
  • 忘记 init() 是编译错误陈述。
  • 最佳答案

    您可以使用 来延迟特征的初始化。早期定义 . (参见 scala language specification 的第 5.1.6 节)

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

    关于scala - 延迟特征初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16251379/

    相关文章:

    c++ - 还使用 C++ 静态初始化器时的 Linux 共享库初始化和取消初始化

    java - 声明自定义 View 构造函数

    c++ - 当没有显式关键字与单参数构造函数一起使用时,编译器可以发出警告吗?

    class - Scala案例类层次结构

    scala - 覆盖 Scala 枚举中的 toString 方法

    scala - 可以给Actions添加参数吗?

    c++ - 为什么构造函数在某些情况下不起作用?

    java - 调用原始类型 int 的构造函数

    java - 静态类初始化器 - 是否存在需要同步的情况?

    java - 从 Java Integer 到 Scala Int : toInt vs unbox? 的正确方法