今天研究Java自定义事件,貌似就是监听者模式,但为什么要继承实现那些官方的接口和类呢?
具体来说我有以下疑惑
1、自定义的Listener为什么要实现 java.util.EventListener 接口? 不实现也没问题啊
2、自定义Event为什么要继承 java.util.EventObject ? 不集成也挺好啊
3、监听器列表的集合为什么是javax.swing.event.EventListenerList 而不用List之类? 官方api上说:
此类的主要优点是,在没有侦听器的情况下,它相对廉价一些,它在单个地方为事件侦听器提供序列化,同时还提供某种程度的 MT 安全(在正确使用时)。
我没有真正看懂,请高手指教。
下面是从官方api上考下来的例子:
-------------------------------------------------------------------------
EventListenerList listenerList = new EventListenerList();
FooEvent fooEvent = null; public void addFooListener(FooListener l) {
listenerList.add(FooListener.class, l);
} public void removeFooListener(FooListener l) {
listenerList.remove(FooListener.class, l);
}
// Notify all listeners that have registered interest for
// notification on this event type. The event instance
// is lazily created using the parameters passed into
// the fire method. protected void fireFooXXX() {
// Guaranteed to return a non-null array
Object[] listeners = listenerList.getListenerList();
// Process the listeners last to first, notifying
// those that are interested in this event
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i]==FooListener.class) {
// Lazily create the event:
if (fooEvent == null)
fooEvent = new FooEvent(this);
((FooListener)listeners[i+1]).fooXXX(fooEvent);
}
}
}
为什么要用这个EventListenerList搞得这么复杂? 尤其是protected void fireFooXXX()这个方法中的for循环,乍一看头疼,用List多干脆呀?这些疑问总有合理的解释,既然别人这样做,肯定有目的,希望大侠能从本质上说说看...
具体来说我有以下疑惑
1、自定义的Listener为什么要实现 java.util.EventListener 接口? 不实现也没问题啊
2、自定义Event为什么要继承 java.util.EventObject ? 不集成也挺好啊
3、监听器列表的集合为什么是javax.swing.event.EventListenerList 而不用List之类? 官方api上说:
此类的主要优点是,在没有侦听器的情况下,它相对廉价一些,它在单个地方为事件侦听器提供序列化,同时还提供某种程度的 MT 安全(在正确使用时)。
我没有真正看懂,请高手指教。
下面是从官方api上考下来的例子:
-------------------------------------------------------------------------
EventListenerList listenerList = new EventListenerList();
FooEvent fooEvent = null; public void addFooListener(FooListener l) {
listenerList.add(FooListener.class, l);
} public void removeFooListener(FooListener l) {
listenerList.remove(FooListener.class, l);
}
// Notify all listeners that have registered interest for
// notification on this event type. The event instance
// is lazily created using the parameters passed into
// the fire method. protected void fireFooXXX() {
// Guaranteed to return a non-null array
Object[] listeners = listenerList.getListenerList();
// Process the listeners last to first, notifying
// those that are interested in this event
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i]==FooListener.class) {
// Lazily create the event:
if (fooEvent == null)
fooEvent = new FooEvent(this);
((FooListener)listeners[i+1]).fooXXX(fooEvent);
}
}
}
为什么要用这个EventListenerList搞得这么复杂? 尤其是protected void fireFooXXX()这个方法中的for循环,乍一看头疼,用List多干脆呀?这些疑问总有合理的解释,既然别人这样做,肯定有目的,希望大侠能从本质上说说看...
比如EventObject的getSource方法,EventListenerList 的add,remove,get方法等。
所以别人只是给你提供了方便,你用可以少些写代码。