Java 如何创建新对象并从相同类型的旧对象保留侦听器
我有一个实现了PropertyChangeSupport的航班,如下所示: 受保护的列表更改侦听器 public void addPropertyChangeListenerPropertyChangeListenerListenerToAdd{…} public void removePropertyChangeListenerPropertyChangeListener listenerToRemove{…} 私有void notifyChangeListenerString消息{…} …经典的观察者模式。我想要完成的是创建新的Flight对象,但保留现有的PropertyChangeListeners。这个看似简单的任务让我深入到多线程和并发问题中,同时发现了失效侦听器问题 这是我的第一个不起作用的简单解决方案:Java 如何创建新对象并从相同类型的旧对象保留侦听器,java,Java,我有一个实现了PropertyChangeSupport的航班,如下所示: 受保护的列表更改侦听器 public void addPropertyChangeListenerPropertyChangeListenerListenerToAdd{…} public void removePropertyChangeListenerPropertyChangeListener listenerToRemove{…} 私有void notifyChangeListenerString消息{…} …经
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?必须有一些更简单的解决方案?我们已经扩展了答案,添加了正确的逻辑。您不应该在一次迭代中调用下两次。我编辑了代码。我没有得到任何异常,但代码不工作。我错过了一些重要的东西!