Java 观察特定类型的事件

Java 观察特定类型的事件,java,jakarta-ee,java-ee-6,observer-pattern,observers,Java,Jakarta Ee,Java Ee 6,Observer Pattern,Observers,我在JavaEE中使用观察者模型,其思想是让一个服务向多个观察者触发事件。然而,尽管所有的观察者都在听同一个事件,但他们中的每一个人都只对一个特定的事件类型感兴趣,该类型是在一个事件中指定的。我当前的代码是这样的: public class Service { public void fireEvent(EventType type) { MyEvent event = new MyEvent(type); fire(event); } } pu

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

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
        }
    }
}
如您所见,所有观察者在执行进一步操作之前都必须检查类型,这增加了源代码内部的重复。此外,由于所有观察者都将接收相同的事件,而实际处理该事件的人却寥寥无几,因此我担心这会带来不必要的性能开销

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

  • 您可以为每种事件类型使用单独的队列/事件:
public void observeEvent(@Observes MyEventOfType1事件)
public void observeEvent(@MyEventOfType2事件)

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

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);
            }
        }
    }
}
公共类类型过滤器{
列表侦听器ll=ArrayList();
公共空添加(侦听器l){
l、 加(ll);
}
public void observeEvent(@MyEvent事件){
if(EventType.TYPE_A.equals(event.getType()){
for(侦听器l:ll){
l、 观察事件(事件);
}
}
}
}
}

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

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

  • 使用限定符:

public void observeEvent(@Observes@EventType1 MyEvent事件)
public void observeEvent(@Observes@EventType2 MyEvent事件)


请参阅Oracle,以及限定符是如何使用的

谢谢,但您能否解释前两个选项的更多信息?我不想使用第三个选项,因为它可能会在源代码中引入更多重复和复杂的内容,即所有事件的处理方式基本相同,几乎没有差异。我已更新了答案。我还添加了另一个选项(限定符)在这种情况下,这似乎是我最喜欢做的事情(但我从未使用过)。