我需要一种智能的组件组合机制,它允许混合特征在组合组件之后进行初始化。以下抛出一个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
; 这会产生大量需要变得懒惰的 val,这是我不想要的。 - 放入
addListener
一个方法,例如initDynamic()
;因为我将混合许多特征,而且我不想记得调用六种initFoo()
方法。 - 使用
DelayedInit
. 至少根据 scaladocs,这不适用于特征。
我可以接受一个init()
电话,但仅限于以下条件:
- 所有混合的特征都可以很容易地声明在这个单一的调用中被调用
- 忘记该
init()
语句是编译错误。