gpt4 book ai didi

java - 观察特定类型的事件

转载 作者:行者123 更新时间:2023-12-01 14:26:07 25 4
gpt4 key购买 nike

我在 Java EE 中使用观察者模型,其想法是让一个服务向多个观察者触发事件。然而,尽管所有观察者都在监听同一个事件,但每个观察者只对事件内部指定的特定事件类型感兴趣。我当前的代码是这样的:

public class Service {
public void fireEvent(EventType type) {
MyEvent event = new MyEvent(type);
fire(event);
}
}

public class TypeAObserver {
public void observeEvent(@Observes MyEvent event) {
if (EventType.TYPE_A.equals(event.getType()) {
// do something
}
}
}

public class TypeBObserver {
public void observeEvent(@Observes MyEvent event) {
if (EventType.TYPE_B.equals(event.getType()) {
// do something
}
}
}

正如您所看到的,所有观察者都必须在执行进一步操作之前检查类型,这会增加源代码内的重复。而且,由于所有观察者都会收到相同的事件,而只有少数观察者真正处理它,这恐怕会带来不必要的性能开销。

因此,我正在寻找其他方法,最好不使用 Java EE 之外的任何新库,以使每个观察者仅监听特定类型的事件。

最佳答案

  • 您可以为每种事件类型使用单独的队列/事件:

public void observeEvent(@Observes MyEventOfType1 event)
public void observeEvent(@Observes MyEventOfType2 event)

  • 在通用队列之上构建过滤队列:过滤队列根据事件类型进行过滤。然后让消费者观察过滤后的队列。

伪代码:

public class TypeAFilter {
List listeners ll = ArrayList<Listener>();

public void add(Listener l) {
l.add(ll);
}

public void observeEvent(@Observes MyEvent event) {
if (EventType.TYPE_A.equals(event.getType()) {
for (Listener l : ll) {
l.observeEvent(event);
}
}
}
}

}

这基本上意味着过滤器过滤器既是观察者又是可观察的。过滤器正在观察您的服务,特定事件的消费者附加到过滤器。

  • 考虑将 instanceof 与不同的事件类一起使用,但我不确定它是否真的比 equals 更快

  • 使用限定符:

public void observeEvent(@Observes @EventType1 MyEvent event)
public void observeEvent(@Observes @EventType2 MyEvent event)

请参阅 Oracle 的 example ,以及限定符如何 defined

关于java - 观察特定类型的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17165655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com