为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕侠2389804 2021-05-14 14:08:58
我正在尝试编写一个自定义事件。我读到我应该拥有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 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

这里的每个元素Set都是Event的侦听器:


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


查看完整回答
反对 回复 2021-05-26
?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

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


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


myEvent.addListener(this);

// some lines of code later...

myEvent.addListener(this);

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


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


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


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


查看完整回答
反对 回复 2021-05-26
  • 2 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信