编写自定义事件的侦听器界面

时间:2018-07-15 08:41:15

标签: java events interface custom-events

我正在尝试编写一个自定义事件。我读到应该有3件事:1.组件类,2.事件类和3.侦听器接口。

我的问题是我必须在一个这样的类中建立一组侦听器:

public class MyEvent{
     private Set<EventListener> = new HashSet<>();
        public synchronized void addListener(EventListener listener){
        listeners.add(listener);
     }

      //and the rest of the code for firing event .. 

}

这是界面:

 public interface EventListener {
      void hungry(MyEvent event);
 }

我不明白拥有一组接口意味着什么?

2 个答案:

答案 0 :(得分:1)

Set的每个元素都是事件的侦听器:

 private Set<EventListener> = new HashSet<>();

在您的设计中,似乎有多个订阅者可以订阅同一事件的通知。
例如,假设您有一个事件:“应用程序启动”。多个对象可能想知道此通知事件。

请注意,该事件通常不会存储侦听器(或观察者)。存储它们是组件(或可观察的)的作用。您还应该提供一种通知侦听器的方法。例如:

public class MyComponent{
     private Set<EventListener> listeners = new HashSet<>();

     public synchronized void addListener(EventListener listener){
        listeners.add(listener);
     }

     public void notify(MyEvent myEvent){
        listeners.stream().forEach(e->e.hungry(myEvent));
     }
}

您可以通过以下方式设置对象之间的关系:

MyComponent component = new MyComponent();
EventListener fooListener = new EventListenerImpl(...);
EventListener barListener = new EventListenerImpl(...);
component.addListener(fooListener);
component.addListener(barListener);
// trigger the event
component.notify(new HugryEvent());

答案 1 :(得分:0)

一组接口基本上是接口的集合,或更通俗地说,是接口的“束”。

使用HashSet可以防止人们意外添加相同的侦听器:

myEvent.addListener(this);
// some lines of code later...
myEvent.addListener(this);

同一侦听器将具有相同的哈希码,并且在这种情况下HashSet.add不会将元素添加到集合中。请注意,接口也有hashCode方法,因为它是在Object中声明的。

添加两个相同的侦听器的坏事是,从侦听器的角度来看,似乎该事件发生了两次。根据事件的不同,这可能会产生很大的影响。

我可以想到的一种不受欢迎的情况:

您正在编写游戏,事件侦听器将处理“购买”按钮的单击。如果在用户只单击一次监听器时调用了该监听器两次,则播放器可能会意外损失一些钱。