以下代码取自 Oracle jdk1.8.0_40 AbstractListModel 类。

   /**
     * <code>AbstractListModel</code> subclasses must call this method
     * <b>after</b>
     * one or more elements of the list change.  The changed elements
     * are specified by the closed interval index0, index1 -- the endpoints
     * are included.  Note that
     * index0 need not be less than or equal to index1.
     *
     * @param source the <code>ListModel</code> that changed, typically "this"
     * @param index0 one end of the new interval
     * @param index1 the other end of the new interval
     * @see EventListenerList
     * @see DefaultListModel
     */
    protected void fireContentsChanged(Object source, int index0, int index1)
    {
        Object[] listeners = listenerList.getListenerList();
        ListDataEvent e = null;

        for (int i = listeners.length - 2; i >= 0; i -= 2) {
            if (listeners[i] == ListDataListener.class) {
                if (e == null) {
                    e = new ListDataEvent(source, ListDataEvent.CONTENTS_CHANGED, index0, index1);
                }
                ((ListDataListener)listeners[i+1]).contentsChanged(e);
            }
        }
    }

我的问题是
  • 为什么迭代从 listeners.length - 2 开始,那么 listeners.length - 1 元素呢?
  • 为什么每个其他元素( i -= 2 )都会触发该事件?
  • 为什么迭代以相反的顺序进行?

  • code in openjdk 的链接也是如此。

    最佳答案

    listeners 数组包含偶数索引中的监听器 Class 对象和奇数索引中的监听器实例。

    因此,循环检查 listeners 数组中每个偶数索引的类型

    if (listeners[i] == ListDataListener.class
    

    但仅针对奇数索引触发事件:
    ((ListDataListener)listeners[i+1]).contentsChanged(e);
    
    listeners.length - 1 不会被跳过。从 i == listeners.length - 2 , i+1 == listeners.length - 1 .

    我不确定逆序迭代的原因。

    关于java - JDK 中这段代码的目的是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31699396/

    10-09 07:57