Java相当于Cocoa NSNotification?

时间:2009-01-28 19:07:39

标签: java objective-c cocoa events notifications

我正在使用SWT小部件编写Java应用程序。我想在某个事件发生时更新某些小部件的状态(例如,更新数据模型的状态)。

Java中是否存在类似于Cocoa的NSNotificationCenter的内容,我可以在其中注册一个对象来侦听通知事件并对其进行响应,以及让其他对象“触发”通知?

7 个答案:

答案 0 :(得分:8)

好的,例如,假设您希望在Loader开始扫描时以及完成扫描时通知程序的某些部分(不要担心Loader是什么,或扫描是什么,这些是我上一份工作中存在的一些代码的例子。您定义一个接口,称之为“ScanListener”,如

public interface ScanListener
{
  public void scanStarted();
  public void scanCompleted();
}

现在,Loader为您的其他代码定义了一个注册回调的方法,比如

public void addScanListener(ScanListener listener)
{
  listeners.add(listener);
}

Loader在开始扫描时执行以下代码

for (ScanListener listener : listeners)
{
  listener.scanStarted();
}

当它完成时,它与listener.scanCompleted();

做同样的事情

需要通知这些事件的代码实现该接口(自身或内部类),并调用“loader.addScanListener(this)”。它的scanStarted()和scanCompleted()方法在适当的时候被调用。您甚至可以使用带参数和/或返回结果的回调来执行此操作。这完全取决于你。

答案 1 :(得分:2)

您在寻找什么样的通知?如果您只想让一个对象能够告诉其他人“嘿,我已经改变,相应地更新”,最简单的方法是使用现有的Observer接口和Observable类。或者使用一个界面编写自己的界面,该界面定义了您希望从已更改的侦听器调用的内容。

答案 2 :(得分:2)

没有预先存在的每个进程服务在java中调度与默认NSNotificationCenter等效的事件。在java中,事件的类型由事件对象指定为特定类型(这也意味着通知方法依赖于该类型)而不是使用字符串。在泛型之前,编写一个通常的事件调度程序和接收器也是不可能的类型安全(见证了AWT和Spring库中* Event类和* EventListener接口的激增)。

有一些活动派遣设施。如Paul所述,有java.util.Observable,正如您所指出的那样,需要进行子类化。还有java.beans.PropertyChangeSupport,根据您的情况可能会有用。

你也可以自己写一个。 PropertyChangeSupport的来源可能在openjdk中提供,您可以查看已弃用的Apache Commons Event项目。根据您的需要,您可能不得不担心线程,seralization,内存泄漏(确保取消注册或使用弱引用)和并发修改(迭代监听器列表的副本,因为监听器可能决定取消注册自身)响应变化)。

现在Java中存在泛型,可以使用通用事件调度库;但是,我没有遇到任何问题。任何人吗?

答案 3 :(得分:1)

实际上有一个内置于Java的工具可以完全满足您的需求,但这并不是您可能已经考虑过的,而且,说实话,它可能对您想要的内容有点重量级。

然而,它确实存在。

这是JMX。

您可以创建MBean,然后其他人可以注册来自这些MBean的事件。然后,MBean可以发送通知。

我个人不会考虑在这种情况下使用它(我只是砸了我自己的),但设施就在那里,并且很好地定义和记录。

答案 4 :(得分:0)

不是Java,但IPython项目有一个用Python here编写的通知中心,您可以将其用作Java版本的模板。

答案 5 :(得分:0)

在Java中,这将是一个向其侦听器发送通知的提供程序。但是Java并没有提供与Cocoa的NSNotification相关的松散耦合,因为在Java提供者和订阅者中必须互相引用。比较“为Java开发人员学习Objective-C”中的第18章。

答案 6 :(得分:0)


Java 中有 IOS NSNotificationCenter 的实现。
您可以在以下位置找到源代码: This Github project