Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的通知系统_Java_Notifications - Fatal编程技术网

Java中的通知系统

Java中的通知系统,java,notifications,Java,Notifications,我正在为我的系统构建一个API,它接收UDP消息并解析它们。现在我需要通知开发人员这些更改 目前我有两个实现,但我不确定哪一个更好,是否还有其他选择 解决方案A阵列锁定队列 它似乎在怠速时不消耗任何功率。在API方面,我只需要创建一个静态数组,并在需要通知新更改时向其添加消息。因此,在开发人员方面,我可以将其放在一个线程中,以侦听任何新消息。用户将获取消息,检查其类型和属性等 解决方案B回调 我相信这个解决方案会更漂亮、更有组织。我只需创建一个包含所有可能通知类型的接口,然后开发人员就可以实现这

我正在为我的系统构建一个API,它接收UDP消息并解析它们。现在我需要通知开发人员这些更改

目前我有两个实现,但我不确定哪一个更好,是否还有其他选择

解决方案A阵列锁定队列

它似乎在怠速时不消耗任何功率。在API方面,我只需要创建一个静态数组,并在需要通知新更改时向其添加消息。因此,在开发人员方面,我可以将其放在一个线程中,以侦听任何新消息。用户将获取消息,检查其类型和属性等

解决方案B回调

我相信这个解决方案会更漂亮、更有组织。我只需创建一个包含所有可能通知类型的接口,然后开发人员就可以实现这个接口。在API方面,我有一个相同侦听器的hashmap,这样API可以通知多个相同类型的侦听器


还有什么想法或建议吗?

对于任何基于事件的系统,异步解决方案都是首选。正如您所注意到的,它比阻塞解决方案更轻量级,后者要求每个事件接收器有一个线程。因此,有利于解决方案B

不过,需要注意的一件事是线程问题:您将在自己的线程中调用回调,因此回调实现者必须准备好处理这个问题。回调代码不能假定它是在任何特定线程上执行的;它也可能每次都在不同的线程上执行。

该模式可能会对您有所帮助,特别是在同一主题可能有多个侦听器的情况下

定义侦听器hashmap的另一种方法是使用CopyOnWriteArrayList侦听器。使用这种方法,添加新的侦听器不会干扰侦听器上的迭代

定义接受所有可能通知类型的接口的另一种方法是使用一个方法定义一个接口,该方法接受所有可能通知类型的根类或接口。例如,此接口可以接收任何子类化参数化类型事件的事件对象

public interface IObserver<EVENT> {
    public void receive( @NonNull EVENT event );
}
公共接口IObserver{
公共无效接收(@NonNull事件);
}

OP在其解决方案B中假设了观察者。在本文中,“回调”实际上是“观察者”的同义词。OP没有提到观察者模式。对现有模式的了解在最坏的情况下是无害的,而且可能是有用的。我敢打赌,他对模式了如指掌!投机OP并不是唯一一个读这些的人。