有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

编写自定义事件时的java侦听器接口

我正在尝试编写自定义事件。我读到我应该有三样东西: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) 个答案

  1. # 1 楼答案

    一组接口基本上是一组接口,或者更通俗地说是一组接口

    使用HashSet可以防止人们意外地添加同一个侦听器:

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

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

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

    我能想到的一种情况是,这是不可取的:

    您正在编写一个游戏,事件侦听器处理“购买”按钮的点击。如果在用户只点击一次的情况下,侦听器被调用两次,玩家可能会意外地损失一些钱

  2. # 2 楼答案

    这里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());