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

2022-09-04 02:53:40

当我学习如何在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 组件中时才重要 - 这对事件调度线程是否重要?


答案 1

EventListenerList有一个方法,专门用于您只对一种事件类型感兴趣的情况。getListeners(Class<T> t)

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

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

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


答案 2

对我来说,主要优点是包含类具有(或可能具有)多种类型的侦听器。许多秋千组件都可以;您正在查看的那个可能没有。第二个示例较短,但它具有隐式设计限制。EventListenerList