Java 为什么AbstractTableModel上的fireTableChanged()从后到前通知侦听器?

Java 为什么AbstractTableModel上的fireTableChanged()从后到前通知侦听器?,java,swing,jtable,tablemodel,event-queue,Java,Swing,Jtable,Tablemodel,Event Queue,这是不清楚的,但是由于某种原因,AbstractTableModel中的通知是从后到前的,这导致了代码中的一个bug。我可以解决它,但我想知道是否有人知道为什么通知是这样做的 public void fireTableChanged(TableModelEvent e) { // Guaranteed to return a non-null array Object[] listeners = listenerList.getListenerList(); // Pro

这是不清楚的,但是由于某种原因,
AbstractTableModel
中的通知是从后到前的,这导致了代码中的一个bug。我可以解决它,但我想知道是否有人知道为什么通知是这样做的

public void fireTableChanged(TableModelEvent e) {
    // 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]==TableModelListener.class) {
        ((TableModelListener)listeners[i+1]).tableChanged(e);
        }
    }
}

侦听器被放入堆栈中。因此,当它们收到通知时,它们会以与放入顺序相反的顺序“弹出”堆栈


如果侦听器的顺序很重要,您应该尝试解决这个问题,而不必关心它们的签入顺序。如果有关系,请更改添加侦听器的顺序。

侦听器被放入堆栈中。因此,当它们收到通知时,它们会以与放入顺序相反的顺序“弹出”堆栈


如果侦听器的顺序很重要,您应该尝试解决这个问题,而不必关心它们的签入顺序。如果有关系,请更改添加侦听器的顺序。

我认为没有真正的原因

可能他们需要额外的安全性,以防在触发事件时侦听器从侦听器列表中删除自己(即,当我们仍在侦听器列表上迭代时)


虽然这并不是真的必要,因为listenerList是一个写时复制的…

我不认为这有什么真正的原因

可能他们需要额外的安全性,以防在触发事件时侦听器从侦听器列表中删除自己(即,当我们仍在侦听器列表上迭代时)


虽然这并不是必须的,因为listenerList是一个写时复制的…

为什么你需要你的监听器按一定的顺序启动?这是一种设计的味道。“从最后到第一,在我的代码中导致了一个错误。”不,在你的代码中的错误是由一开始就假定顺序引起的。解决了这个问题,剩下的就变得无关紧要了。为什么你需要你的听众按一定的顺序开火呢?这是一种设计的味道。“从最后到第一,在我的代码中导致了一个错误。”不,在你的代码中的错误是由一开始就假定顺序引起的。解决了这个问题,剩下的就变得无关紧要了。从概念上讲,它们实际上存储在一个。它们实际上存储在+1中。另请参见此。这篇文章扩展了基本原理。+1请参见此。该报告进一步阐述了理由。