Java:我自己的API中有哪些事件通知选项?

时间:2011-02-08 16:41:23

标签: java multithreading events api

假设您已经编写了一个API,可以在独立线程中实时收集数据。数据访问是线程安全的,并通过接口。例如。 getData(),它不会阻止并提供最新信息。该API用于许多应用程序;一些GUI驱动,其他控制台程序。

您有什么选择通知您的应用程序有数据更新?我们绝对不希望API依赖于应用程序,因此我们不希望fireTableDataChanged()或类似API中的任何内容。 (在我们的GUI应用程序中,我们会在API通知我们或我们查看API之后调用fireTableDataChanged()等。)

非常感谢!

3 个答案:

答案 0 :(得分:3)

一种选择是编写自己的事件生成器类。

  • IEventListener<活动>
  • IEventProducer< LISTENER扩展了IEventListener< EVENT>,EVENT>
  • EventProducer< LISTENER扩展了IEventListener< EVENT>,EVENT>实现IEventProducer< LISTENER,EVENT>

IEventListener由观察者实现。它有一种接收事件的方法。

IEventProducer由任何observable实现,通过EventProducer实现。它有添加和删除监听器的方法。

EventProducer是线程安全的。它有一个方法将事件发送到侦听器的CopyOnWriteArrayList。它捕获并记录侦听器抛出的任何异常。它还提供了添加和删除侦听器的方法。

然后,任何可观察的类都可以通过内部EventProducer实现IEventProducer。

如果尝试在同一个类上支持两种侦听器类型,则键入erasure将要求您为不同的侦听器命名不同的添加/删除侦听器方法。

答案 1 :(得分:2)

您可以查看ObservableObserver。我没有亲自使用它们,看着API,我并不完全相信我关心它。基本上,您的可观察数据对象被强制从Observable类扩展。对数据感兴趣的类必须实现Observer接口并向数据对象注册。这个API自1.0以来就存在,不是通用的,我认为它很笨重。但是,这是我所知道的Java库中唯一的Observer / Observable模式。

答案 2 :(得分:2)

你基本上有两个选择。

1)轮询API以查看它是否有新数据 2)获取API以在有新数据时通知您。

获取API以通知您可能会使用Observer模式。请注意,您不必使用ObservableObserver,您可以编写自己的接口。基本上它的工作原理如下;

  • 正在观察的事物(您的API)有一个观察者列表,它实现了某种观察者/侦听器接口。它必须支持观察员请求将自己添加到此列表中。
  • 执行观察/侦听的事实现了这个接口并调用API将自己添加到观察者列表中。
  • 当被观察的东西更新它的状态(即有新数据)时,它会通过其观察者列表并通知它们。