我試圖創建一個監聽器的設計模式那樣:NullPointerException異常上一階監聽器模式
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
}
}
但如果失敗了NullPointerException
,因爲listeners
最初等於null
創建listener1
和listener2
時。
我該如何解決這個問題?
編輯:我試過如下:
def addListener(g: Listener) = {
if(listeners == null) {
listeners = List(g)
} else {
listeners = g::listeners
}
}
但問題是類初始化後,聽衆=無。 我需要一個更好的設計模式來實現我的目標。
SOLUTION:不使用懶惰VAL或可變集合:
var listeners: List[Listener] = _
def addListener(g: Listener) = {
if(listeners == null)
listeners = List(g)
else
listeners = g::listeners
}
使用_
初始化,而不是「空」或「無」,使編譯器不listener1
後覆蓋listeners
和listener2
已創建。
實際上用'_'進行初始化與將偵聽器設置爲null – 2013-04-25 13:16:14
不一樣,因爲如果用null替換_,則偵聽器在末尾將等於null。 – 2013-04-25 13:17:23