Khi tôi biết cách kích hoạt các sự kiện trong Java, tôi đã trở nên quen thuộc với EventListenerList. Khi tôi tạo ra thính giả của riêng tôi, tôi viết người nghe nên nó kéo dài EventListener, tôi lưu trữ chúng trong một EventListenerList, và phương pháp lửa của tôi sẽ đi qua nghe sự kiện như thế này:Khi nào sử dụng EventListenerList thay vì một bộ sưu tập chung của người nghe
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);
}
}
}
Bây giờ tôi đang xem xét mã mà chỉ đơn giản là đưa người nghe vào một HashMap (có thể là bất kỳ bộ sưu tập), giao diện người nghe không mở rộng EventListener, và phương pháp lửa trông như thế này:
protected void fireChangeOccurred(Change change) {
for (ChangeListener listener : listeners) {
listener.changeOccurred(change);
}
}
những lợi thế của việc sử dụng EventListenerList thay vì chỉ duy trì riêng của tôi là gì danh sách người nghe? Liệu nó có thực sự quan trọng nếu người nghe đang ở trong một thành phần Swing - nó có quan trọng đối với Chủ đề sự kiện không?
Chỉ cần đảm bảo rằng bạn biết, 2 vòng lặp đó không giống nhau - vòng lặp đầu tiên lặp lại từ đầu đến cuối và vòng lặp thứ hai lặp lại từ đầu đến cuối. Nếu người nghe được phép xóa chính nó (thường là), thì bạn sẽ muốn lặp lại từ đầu đến cuối để tránh bỏ qua người nghe tiếp theo nếu người nghe hiện tại xóa chính nó. –