Java 相当于 Cocoa NSNotification?
-
20-08-2019 - |
题
我正在使用 SWT 小部件编写 Java 应用程序。我想在发生特定事件时更新某些小部件的状态(例如,更新数据模型的状态)。
Java 中是否有类似于 Cocoa 的 NSNotificationCenter 的东西,我可以在其中注册一个对象来侦听通知事件并响应它们,以及让其他对象“触发”通知?
解决方案
好吧,假设例如,你希望你的程序的一部分,当你开始装载机扫描得到通知,并且当它完成扫描(不担心装载机是什么,或扫描是什么,这些从一些代码,我已经从我上一份工作躺在附近)的例子。你定义一个接口,把它称为“ScanListener”,如
public interface ScanListener
{
public void scanStarted();
public void scanCompleted();
}
现在装载程序定义了一个方法,用于您的其他代码,以用于注册回调,像
public void addScanListener(ScanListener listener)
{
listeners.add(listener);
}
在装载机,当它开始扫描时,执行以下的代码
for (ScanListener listener : listeners)
{
listener.scanStarted();
}
和当它完成时,做同样的事情与listener.scanCompleted();
这需要通知这些事件的代码实现该接口(无论是本身或者在一个内部类),并调用“loader.addScanListener(这)”。它scanStarted()和scanCompleted()方法被调用在适当的时间。你甚至可以带参数和/或返回的结果回调做到这一点。这一切都取决于你。
其他提示
什么样的通知你找谁?如果你想要的是一个目的是能够对任何人说“哎,我已经改变,相应地更改”,最简单的方法是使用现有的Observer接口和可观察类。或者自己写一个接口,它定义你想获得呼吁从已经改变了一个听众的东西。
有这么调度事件在Java这等同于默认NSNotificationCenter没有预先存在的每个进程的服务。在Java中,事件的类型是由该事件对象是一个特定类型的(这也意味着,该通知方法取决于该类型),而不是使用一个字符串指定。在此之前泛型,写一个普通事件调度器和接收器也是类型安全是不是真的有可能(见证了AWT和Spring库*事件类和* EventListener的接口的增殖)。
有事件派遣一些设施。由于保罗的提到,有java.util.Observable
,正如你所指出的,需要子类。还有java.beans.PropertyChangeSupport
,这可能会根据您的情况是有用的。
您也可以自己写一个。对于PropertyChangeSupport
源是在OpenJDK的可能可用,你可以看看被遗弃的阿帕奇百科全书事件一>项目。根据您的需求,您可能会担心,如线程,seralization,内存泄漏(确保注销或使用弱引用)和并发修改的东西(遍历您的听众列表的副本,作为听者可以决定注销本身响应于变化)。
现在,在Java中存在泛型,一般事件调度库将是可能的;但是,我还没有碰到过任何。任何人吗?
有实际上是内置在Java中的设施,不正是你想要的东西,但它不是你也许认为,而且,说实话,很可能你想要的东西有点重量级。
但是,尽管如此,它确实存在。
这是JMX。
您创建的MBean,然后其他人可以从那些MBean的注册事件。则MBean可以发送通知的。
我个人不会考虑使用它的这种情况下(我只是砸向了我自己),但该设施是存在的,它明确界定,并记录在案。
不是Java,但是IPython项目有一个用Python编写的通知中心 这里 您可以将其用作 Java 版本的模板。
在Java中,这将是一个供应商解雇通知它的听众。但Java不提供您可可的NSNotification得到松耦合因为在Java提供者和用户必须互相引用。在“学习目标C Java开发”本章18进行比较。
,点击 还有的实施 IOS NSNotificationCenter 在的Java 。点击 您可以在源代码: 这Github的项目