何时使用EventListenerList而不是一般的侦听器集合

时间:2010-07-13 18:59:17

标签: java swing events

当我学习如何用Java激活事件时,我熟悉了EventListenerList。当我创建自己的监听器时,我编写监听器,因此它扩展了EventListener,我将它们存储在EventListenerList中,我的fire方法将通过这样的事件监听器:

protected void fireChangeOccurred(Change change) {
    Object[] listeners = listenerList.getListenerList();
    for (int i = listeners.length-2; i>=0; i-=2) {
        if (listeners[i]==ChangeListener.class) {
            ((ChangeListener)listeners[i+1]).changeOccurred(change);
        }
    }
}

现在我正在查看只是将侦听器放入HashMap(可能是任何集合)的代码,侦听器接口不会扩展EventListener,而fire方法如下所示:

protected void fireChangeOccurred(Change change) {
    for (ChangeListener listener : listeners) {
        listener.changeOccurred(change);
    }
}

使用EventListenerList而不仅仅是维护我自己的侦听器列表有什么好处?如果侦听器在Swing组件中,它是否真的唯一 - 对于事件调度线程是否重要?

3 个答案:

答案 0 :(得分:7)

EventListenerListmethodgetListeners(Class<T> t),专门针对您只对一种事件类型感兴趣的情况。

以下是如何使用它的示例:

protected void fireChangeOccurred(Change change) {
    for (ChangeListener listener:
         listenerList.getListeners(ChangeListener.class)) {
            listener.stateChanged(new ChangeEvent(this));
    }
}

如果您选择维护自己的听众集合,我建议您使用CopyOnWriteArrayList

答案 1 :(得分:6)

对我而言,EventListenerList的主要优点是,如果包含类具有(或可能具有)多个类型的侦听器。许多Swing组件都可以;你正在审查的那个可能没有。第二个例子较短,但它具有隐含的设计限制。

答案 2 :(得分:3)

这一天没有巨大的优势。只是小优化。这是JavaDocs所说的:

  

该课程提供的主要好处   这是相对便宜的   没有听众的情况,它提供   事件监听器列表的序列化   在一个地方,以及一个学位   MT安全性(正确使用时)

使用现代JVM和集合,这无关紧要。但是如果你使用Swing,那么你可以用自己的实现来提供在EDT上触发更改的方法 - 这将是有益的。