【发布时间】:2015-07-04 07:37:46
【问题描述】:
我有实现 PropertyChangeSupport 的 Flight 类,如下所示:
受保护的列表 changeListeners;
public void addPropertyChangeListener(PropertyChangeListener listenerToAdd){ ...}
public void removePropertyChangeListener(PropertyChangeListener listenerToRemove){ ... }
private void notifyChangeListeners(String message){ ...}
...经典的观察者模式。我想要完成的是创建新的 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;
}
我没有收到任何错误,但这并没有起到应有的作用。所有 PropertyChangeListeneres 仍然链接到旧的 Flight 对象,并且 PropertyChangeEvents 在应该被触发之前被触发。
我完全错过了逻辑吗?这看起来应该是微不足道的?
问题是关于设计的。这是用旧的 PropertyChangeListeners 创建新对象的好设计吗?
【问题讨论】:
-
确切的例外是什么?哪一行代码抛出了这个异常?答案可能很明显,但可以肯定的是,我们需要更多细节。
标签: java