代码之家  ›  专栏  ›  技术社区  ›  David Koelle

何时使用EventListenerList而不是侦听器的常规集合

  •  13
  • David Koelle  · 技术社区  · 14 年前

    当我学会如何在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);
        }
    }
    

    它真的只在侦听器位于Swing组件中时才重要吗?它对事件调度线程重要吗?

    3 回复  |  直到 14 年前
        1
  •  6
  •   trashgod    14 年前

    对我来说 EventListenerList 如果包含类有(或可能有)多个 类型 听众的声音。很多摇摆组件都有;你正在复习的那个可能没有。第二个例子比较短,但是它有隐含的设计限制。

        2
  •  7
  •   Community THelper    11 年前

    EventListenerList 有一个 method , getListeners(Class<T> t) ,特别是对于只对一种事件类型感兴趣的情况。

    下面是一个如何使用它的示例:

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

    如果您选择维护自己的侦听器集合,我建议 CopyOnWriteArrayList

        3
  •  3
  •   Eugene Ryzhikov    14 年前

    现在没有什么大的好处。只是一些小的优化。JavaDocs是这么说的:

    该类提供的主要好处 是因为它在市场上相对便宜吗 没有侦听器的情况下,它提供 MT安全(正确使用时)

    对于现代的jvm和集合来说,这真的无关紧要。但是,如果您使用Swing,您可以使用自己的实现提供在EDT上触发更改的方法,这将是有益的。