Java中侦听器的正确(和最佳)集合类型

时间:2016-04-12 10:55:56

标签: java listener observer-pattern eventlistenerlist

我只想在我的一个课程中介绍一个小观察者模式(听众),我想使用最佳实践方法。

我的监听器界面:

public interface ExpansionListener {
    void expanded();
    void collapsed();
}

因此,我想保留一个听众列表

private List listener; // What kind of list should I take?

以及两种方法addListener(ExpansionListener l)removeListener(ExpansionListener l)

现在,我的问题:我应该选择什么样的清单?我考虑过使用像CopyOnWriteArrayList这样的并发列表,但我发现EventListenerList也存在。 Java中监听器列表的最佳实践方法是什么?

1 个答案:

答案 0 :(得分:11)

CopyOnWriteArrayList是线程安全的。并非所有Swing组件都是线程安全的。

注意:在Java 8之前,迭代此集合会产生垃圾,但是在Java 8中,Iterator可以使用Escape Analysis放置在堆栈中。

final List<EventListener> listeners = new CopyOnWriteArrayList<>();

if (!listeners.contains(listener))
     listeners.add(listener);

使用Set会更好esp,因为您可能希望以线程安全的方式忽略侦听器的重复注册。

final Set<EventListener> listeners = new CopyOnWriteArraySet<>();

listeners.add(listener);

性能将大致相同,尽管CopyOnWriteArraySet具有add是原子的优势,而contains然后add不是原子的。

编辑:正如@Hulk建议您可以使用CopyOnWriteArrayList.addIfAbsent,但此方法在列表中不可用。

final CopyOnWriteArrayList<EventListener> listeners = new CopyOnWriteArrayList<>();

listeners.addIfAbsent(listener);