gpt4 book ai didi

java - JDK 中这段代码的用途是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:54:39 25 4
gpt4 key购买 nike

以下代码摘自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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com