java如何安全地处理通知侦听器状态或异常而不产生歧义?
我正在考虑重新设计一个监听器接口,以删除空对象,从而使API使用起来更安全。目前的设计如下:
@Override
public void acceptPerformed(
AcceptEvent event,
Throwable exception)
{
}
这是一个简单的接口,如果exception == null
,那么event != null
,反之亦然。这是相当干净和简单的
为了消除将null传递给这个侦听器,我考虑了一些替代方法,但它所做的似乎只是移动目标帖子。例如,将每个对象包装在Optional
中:
@Override
public void acceptPerformed(
AcceptEvent event)
{
if (!event.isAccepted()) {
event.getException().get()...
// Notify the UI of failed accept
return;
}
event.getEvent().get()...
// Do something
}
在本例中,我不提供替代对象,因为没有一个对象是可接受的。即使我可以提供我自己的运行时错误,监听器契约是这样的,它不应该抛出一个错误。但是在这个例子中,我觉得我只是把NullPointerException
移动到一个潜在的NoSuchElementException
。也许它通过显式地包装为Optional
消除了传递的对象是否可以为null的模糊性,但我认为这并不是一个很大的改进
我考虑传递一个可以检查isAcceptEvent instanceof AcceptEventExceptionally
的对象,但同样,这只是移动到一个潜在的ClassCastException
要保证提供给侦听器的所有对象都是格式良好的,并且不需要null、optionals或cast,我能想到的唯一解决方案是为成功和错误条件使用单独的侦听器。这将使侦听器的数量增加一倍,并且使侦听器逻辑更难处理
是否有任何模式可以应用于此,以提供比上面列出的更安全的侦听器
触发accept事件的操作可能引发I/O异常,因此不能保证它总是成功。I/O循环在单独的线程中运行,并通过侦听器将事件通知主线程。下面是一个示例实现:
while (running) {
try {
// Do some I/O things
}
catch (IOException ex) {
for (AcceptListener l : listeners)
l.acceptPerformed(new AcceptEvent(ex));
continue;
}
}
for (AcceptListener l : listeners)
l.acceptPerformed(new AcceptEvent(someObject));
共 (0) 个答案