我在Google上搜索了解如何创建自定义事件和事件监听器。在阅读了一些关于它的文章后,我仍然感到困惑。我想请你们回顾一下 制作自定义事件(非GUI相关事件)和处理程序的方法。有些人可以提供有关如何创建自定义事件和侦听器的简单说明吗?
答案 0 :(得分:6)
您基本上创建一个接口作为侦听器,例如
public interface EatListener {
...
}
在EatListener类中,您可以使用事件作为方法参数调用方法;比如
public void onEat(EatEvent);
然后你可以有像Human这样的类来实现或实例化EatListener;比如
public class Human {
private EatListener listener;
public void eatFood(Food food) {
if(listener != null) {
listener.onEat(new EatEvent(food));
}
}
}
然后你需要有实际的EatEvent;这可能就像食物的包装一样简单,可能还有一些额外的数据。
与java上的任何GUI一样,您可以从该接口创建匿名内部类:
new EatListener() {
public void onEat(EatEvent event) {
System.out.println("I just ate " + event.getFood().getName());
}
}
答案 1 :(得分:1)
我写了很多基于事件的系统(非gui),并且有许多实现自己的问题。一些经典的东西是线程和内存泄漏。
线程/进程控制只是意味着当你触发事件时,立即或稍后调用侦听器的时间?如果你立即开火,你最终会得到一个表现非常糟糕的系统,该系统会在调用监听器后立即对事件做出反应。这里没有简单的答案,这实际上取决于您的需求。一般来说,如果你可以推迟一个事件的触发,你将有一个更好的系统(因为它可能会避免多次为同一事件调用监听器 - 或导致同一事件的一系列事件)
第二大问题是内存泄漏。 Java中缺少删除是一件很可爱的事情,但是听众是一个绑在你脚上的巨型枪。如果您有一个附加到使用内存加载的实例的侦听器,只要另一个对象包含对该侦听器的引用,该内存就会被挂起。有一堆解决方案,比如WeakReferences,但一般来说,你需要非常小心,在测试你的应用程序时检查一下监听器的数量,并确保它们正常分离(unlisten?:))。
简而言之,如果我是你,我会考虑使用类似的东西:http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/eventbus/package-summary.html 考虑到许多这些问题而制定的http://codingjunkie.net/guava-eventbus/。