2016-04-12 17 views
11

Sadece sınıflarımdan birinde küçük bir gözlemci deseni (dinleyiciler) tanıtmak istiyorum ve en iyi uygulama yaklaşımını kullanmak istiyorum.Java'da dinleyiciler için doğru (ve en iyi) koleksiyon türü

Benim dinleyici arayüzü:

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

nedenle,

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

ve iki yöntem addListener(ExpansionListener l) ve removeListener(ExpansionListener l) dinleyici

bir listesini tutmak istiyorum.

Şimdi benim sorum: Ne tür bir listeyi kullanmalıyım? Ben CopyOnWriteArrayList gibi bir eşzamanlı liste kullanmayı düşündüm, ama ben de EventListenerList var olduğunu öğrendim. Java'da dinleyici listeleri için en iyi uygulama yaklaşımı nedir?

+0

EventListenerList ben 'Listesini kullanırsınız iyi bir aday – Sanjeev

+2

gibi görünüyor ' bir başlangıç ​​için, sadece dinleyici bu tür izin vermek isterseniz. O zaman muhtemelen 'CopyOnWriteArrayList' ile gidecektim çünkü dinleyicilere yapılan değişiklikler muhtemelen oldukça seyrek olmakla birlikte, yazımlar birden fazla ileti dizisiyle paralel olarak gerçekleşebilir (sadece mimarinizle ilgili varsayımlar). – Thomas

+0

A 'Set ', bir nesnenin aynı türde birden fazla dinleyiciye sahip olmasını engellemek için daha uygun olacaktır. – Titus

cevap

9

CopyOnWriteArrayList güvenlidir. Tüm Swing bileşenleri dişli değildir.

Not: Java 8'den önce, bu koleksiyonun üzerinde yineleme çöp üretecektir, ancak Java 8'de Iterator Escape Analysis ile yığına yerleştirilebilir. Eğer bir iş parçacığı güvenli bir şekilde bir dinleyici yinelenen kayıtları göz ardı etmek isteyebilirsiniz olarak ESP tercih olacağını bir Set kullanma

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

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

. CopyOnWriteArraySetaddcontains yapıyor olarak ve daha sonra atom olmadığı durumlarda add, atomik olduğunu avantajına sahip olsa

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

listeners.add(listener); 

performans, hemen aynı olacaktır.

DÜZENLEME: @Hulk, CopyOnWriteArrayList.addIfAbsent'i kullanabileceğinizi önerir, ancak bu yöntem Listede kullanılamaz.

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

listeners.addIfAbsent(listener); 
+0

@Hulk, 'Listede mevcut olmasa da, CopyOnWriteArrayList' için olurdu –

İlgili konular