Mar*_*ger 11 java listener observer-pattern eventlistenerlist
我只是想在我的一个类中引入一个小的观察者模式(听众),我想使用最佳实践方法.
我的监听界面:
public interface ExpansionListener {
void expanded();
void collapsed();
}
Run Code Online (Sandbox Code Playgroud)
因此,我想保留一个听众列表
private List listener; // What kind of list should I take?
Run Code Online (Sandbox Code Playgroud)
和两种方法addListener(ExpansionListener l)和removeListener(ExpansionListener l).
现在,我的问题是:我应该采取什么样的清单?我想过使用像CopyOnWriteArrayList这样的并发列表,但我发现EventListenerList也存在.Java中监听器列表的最佳实践方法是什么?
Pet*_*rey 11
这CopyOnWriteArrayList是线程安全的.并非所有Swing组件都是线程安全的.
注意:在Java 8之前,迭代此集合会产生垃圾,但是在Java 8中,Iterator可以使用Escape Analysis将其放置在堆栈中.
final List<EventListener> listeners = new CopyOnWriteArrayList<>();
if (!listeners.contains(listener))
listeners.add(listener);
Run Code Online (Sandbox Code Playgroud)
使用Set会更好esp,因为您可能希望以线程安全的方式忽略侦听器的重复注册.
final Set<EventListener> listeners = new CopyOnWriteArraySet<>();
listeners.add(listener);
Run Code Online (Sandbox Code Playgroud)
性能将大致相同,尽管它CopyOnWriteArraySet具有add原子性的优势,在做的时候contains然后add不是原子的.
编辑:正如@Hulk建议您可以使用CopyOnWriteArrayList.addIfAbsent,但此方法在List上不可用.
final CopyOnWriteArrayList<EventListener> listeners = new CopyOnWriteArrayList<>();
listeners.addIfAbsent(listener);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
664 次 |
| 最近记录: |