我只是想在我的一个类中引入一个小的观察者模式(听众),我想使用最佳实践方法。
我的监听器界面:
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中监听器列表的最佳实践方法是什么?
该 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,但是这个方法在List上不可用。
final CopyOnWriteArrayList<EventListener> listeners = new CopyOnWriteArrayList<>();
listeners.addIfAbsent(listener);