Java新手 - 自定义EventHandlers

时间:2010-10-18 22:16:06

标签: java

在此示例中(来自Oracle Site):

// Notify all listeners that have registered interest for
// notification on this event type.  The event instance 
// is lazily created using the parameters passed into 
// the fire method.

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);
     }
 }
}

这是什么

  

听众[I] == FooListener.class

比较吗?它让我有点失望,因为它似乎将一个类的实例与一类类进行比较。如果它说出类似

的话,我会理解的
  

listeners [i] .getClass()== Foolistener.class

但它没有......有人可以在这里启发我吗?提前谢谢!

3 个答案:

答案 0 :(得分:1)

因为这就是getListenerList()的文档所说的。

  

public Object [] getListenerList()

     

将事件侦听器列表传回   一组ListenerType-listener   对。请注意,为了性能   原因,这个实现过去了   返回实际的数据结构   监听器数据存储在哪个位置   内部!这种方法是有保证的   传回非空数组,以便   火灾中不需要空值检查   方法。一个零长度的Object数组   如果有,应该退还   目前没有听众。警告!!!   绝对没有修改数据   应该包含在这个数组中    - 如果需要进行任何此类操作,则应在副本上进行   返回的数组而不是   数组本身。

数组是Type和Instance的对。因此,索引零是在索引1处找到的实际侦听器的类(或超类),索引2是在3处的实际侦听器的类,等等。

答案 1 :(得分:0)

看起来他们的数组在Class个对象和FooListener个对象之间交替显示。

对于任何nlisteners[2n]将包含Class个实例,listeners[2n + 1]将包含该类的FooListener个实例。

答案 2 :(得分:0)

我将采用完整的辅助途径并建议不使用EventListenerList 。这是一段可怕的代码,只有当你在java 1.4或更早版本中或者你使用一个列表来保存几个不同的监听器类的监听器时才有用。

我建议您使用List<FooListener>作为听众持有人。您仍然可以执行EventListenerList允许的相同内容,但您的代码将更容易理解。

private final List<FooListener> myFooListeners;
...
void fireXXX() {
  FooEvent event = ....
  for (FooListener fl : myFooListeners) {
    fl.xxx(event);
  }
}