我正在使用SWT小部件编写Java应用程序。我想在某个事件发生时更新某些小部件的状态(例如,更新数据模型的状态)。
Java中是否存在类似于Cocoa的NSNotificationCenter的内容,我可以在其中注册一个对象来侦听通知事件并对其进行响应,以及让其他对象“触发”通知?
答案 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