I'm trying to create a listener design Pattern like that:
abstract class Listener(g: Engine) {
g.addListener(this)
}
class Listener1(g: Engine) extends Listener(g)
class Listener2(g: Engine) extends Listener(g)
class Engine {
val listener1 = new Listener1(this)
val listener2 = new Listener2(this)
var listeners: List[Listener] = Nil
def addListener(g: Listener) = {
listeners = g::listeners
}
}
But if fails with a NullPointerException
, because listeners
is initially equal to null
when listener1
and listener2
are created.
How do I overcome this problem?
EDIT: I tried the following:
def addListener(g: Listener) = {
if(listeners == null) {
listeners = List(g)
} else {
listeners = g::listeners
}
}
But the problem is that after the class is initialized, listeners = Nil. I need a better design pattern to achieve my goal.
SOLUTION: Without using lazy val or mutable collections:
var listeners: List[Listener] = _
def addListener(g: Listener) = {
if(listeners == null)
listeners = List(g)
else
listeners = g::listeners
}
Using _
for initialization instead of 'null' or 'Nil' makes the compiler not to overwrite listeners
after listener1
and listener2
have been created.