Java 如何创建新对象并从相同类型的旧对象保留侦听器

Java 如何创建新对象并从相同类型的旧对象保留侦听器,java,Java,我有一个实现了PropertyChangeSupport的航班,如下所示: 受保护的列表更改侦听器 public void addPropertyChangeListenerPropertyChangeListenerListenerToAdd{…} public void removePropertyChangeListenerPropertyChangeListener listenerToRemove{…} 私有void notifyChangeListenerString消息{…} …经

我有一个实现了PropertyChangeSupport的航班,如下所示:

受保护的列表更改侦听器

public void addPropertyChangeListenerPropertyChangeListenerListenerToAdd{…}

public void removePropertyChangeListenerPropertyChangeListener listenerToRemove{…}

私有void notifyChangeListenerString消息{…}

…经典的观察者模式。我想要完成的是创建新的Flight对象,但保留现有的PropertyChangeListeners。这个看似简单的任务让我深入到多线程和并发问题中,同时发现了失效侦听器问题

这是我的第一个不起作用的简单解决方案:

public Flight newFlightWithOldListeners(List<Scans> scansList){
    Flight newFlight=new FlightImpl();
    newFlight.setScansList(scansList);
    newFlight.setExplorerManager(this.getExplorerManager());
    for (Iterator<PropertyChangeListener> iterator = this.getChangeListeners().iterator(); iterator.hasNext();) {
        PropertyChangeListener listener=iterator.next();
        newFlight.addPropertyChangeListener(listener);
        iterator.remove();
    }
    return newFlight;
}
我没有收到任何错误,但这并没有起到应有的作用。所有PropertyChangeListener都与旧的飞行对象保持链接,并且PropertyChangeEvents在应该触发之前就被触发

我完全没有逻辑吗?这看起来应该是微不足道的吗


问题是关于设计。对于使用旧PropertyChangeListeners创建新对象来说,这种设计好吗?

在对基础集合进行迭代时,不能直接更改它,否则会得到ConcurrentModificationException。您应该改用迭代器的remove方法

而不是

this.changeListeners.remove(iterator.next());
照办

iterator.remove()
至于你应该做的逻辑

for (Iterator<PropertyChangeListener> iterator = this.getChangeListeners().iterator(); iterator.hasNext();) {
    PropertyChangeListener propertyChangeListener   = (PropertyChangeListener )iterator.next();
    newFlight.addPropertyChangeListener(propertyChangeListener);
    iterator.remove();
}

在对基础集合进行迭代时,不能直接更改它,否则将得到ConcurrentModificationException。您应该改用迭代器的remove方法

而不是

this.changeListeners.remove(iterator.next());
照办

iterator.remove()
至于你应该做的逻辑

for (Iterator<PropertyChangeListener> iterator = this.getChangeListeners().iterator(); iterator.hasNext();) {
    PropertyChangeListener propertyChangeListener   = (PropertyChangeListener )iterator.next();
    newFlight.addPropertyChangeListener(propertyChangeListener);
    iterator.remove();
}

我怀疑您的问题是因为迭代器,因为您在创建迭代器后修改删除元素ChangeLister。在大多数情况下,迭代器不允许我们从外部更改列表。使用迭代器。删除将修复此问题。

我怀疑您的问题是因为迭代器,因为您在创建迭代器后修改删除元素更改列表。在大多数情况下,迭代器不允许我们从外部更改列表。使用迭代器。删除此项将修复。

确切的异常是什么?哪行代码引发了此异常?答案可能很明显,但可以肯定的是,我们需要更多的细节。确切的例外是什么?哪行代码引发了此异常?答案可能很明显,但可以肯定的是,我们需要更多的细节。感谢iterator.remove,这个remove-ConcurrentModificationException,但我缺少的是逻辑。代码没有按其应有的方式运行。我从旧FlightImpl对象获取propertyChangeEvents,而新对象newFlight不注册PropertyChangeListeners。也许我应该从旧对象或类似对象克隆PropertyChangeListener?必须有一些更简单的解决方案?我们已经扩展了答案,添加了正确的逻辑。您不应该在一次迭代中调用下两次。我编辑了代码。我没有得到任何异常,但代码不工作。我错过了一些重要的东西!感谢iterator.remove,这个remove-ConcurrentModificationException,但是我缺少的是逻辑。代码没有按其应有的方式运行。我从旧FlightImpl对象获取propertyChangeEvents,而新对象newFlight不注册PropertyChangeListeners。也许我应该从旧对象或类似对象克隆PropertyChangeListener?必须有一些更简单的解决方案?我们已经扩展了答案,添加了正确的逻辑。您不应该在一次迭代中调用下两次。我编辑了代码。我没有得到任何异常,但代码不工作。我错过了一些重要的东西!