Why is EventListenerList traversed backwards in fireFooXXX()?

event-listener, java, swing

Solution

- Probably performance considerations: backwards iteration is faster because comparison with 0 is a single machine code instruction - lots of former C programmers have that ingrained even though it's rather irrelevant nowadays. Note that there is no guarantee about the order in which listeners will be notified anyway.

- Look at the rest of the class - it stores the listeners' types as well to provide type safety.

Problem

I don't understand the rationale of this code, taken from javax.swing.event.EventListenerList docs: ``` protected void fireFooXXX() { // Guaranteed to return a non-null array Object[] listeners = listenerList.getListenerList(); // Process the listeners last to first, notifying // those that are interested in this event for (int i = listeners.length-2; i>=0; i-=2) { if (listeners[i]==FooListener.class) { // Lazily create the event: if (fooEvent == null) fooEvent = new FooEvent(this); ((FooListener)listeners[i+1]).fooXXX(fooEvent); } } } ``` - Why is the list traversed backwards? - Why is only every second listener called? The event firing is implemented exactly this way in javax.swing.tree.DefaultTreeModel among others, so it's obviously me who's just not getting something.

Original source