当您设置一个回调监听器上的事件,一般有这样两种方法:
private MyEventListener listener;
...
public void setEventListener(MyEventListener listener){
this.listener = listener;
}
...
// some event later on
this.listener.callback(interestingData);
在这里,每次从客户端类设置监听器时,你替换现有的监听器。只有最后设置监听者的客户端才会收到回叫。
另一种方式是这样的:
private ArrayList<MyEventListener> listeners;
...
public void setEventListener(MyEventListener listener){
if (listeners == null){
listeners = new ArrayList<MyEventListener>();
}
if(!listeners.contains(listener){
listeners.add(listener);
}
}
...
// some event later on
for(MyEventListener listener:listeners){
listener.callback(interestingData);
}
与第二种方法的问题是,你无法控制多少客户接收回调,并注册了很多客户,他们可能会消耗大量的CPU处理回调。
您可以人为地限制听众的数量(if(listeners.count() < 5)
),但从OOP的角度来看这是没有意义的。
哪一个是正确的取决于你的设计。我通常使用后一种模式,因为我知道会有多少客户,数量很少(通常小于5)。
他们(作者)试图解释'add'和'set'之间的区别是什么...... – Selvin
@Selvin您能否详细说明一下? :-) AFAIK,普通旧Java只有'addXXXListener'而不是'set',所以我有点困惑在这里 –