Java事件和事件侦听器

时间:2012-10-15 15:05:30

标签: java event-handling

我在Google上搜索了解如何创建自定义事件和事件监听器。在阅读了一些关于它的文章后,我仍然感到困惑。我想请你们回顾一下 制作自定义事件(非GUI相关事件)和处理程序的方法。有些人可以提供有关如何创建自定义事件和侦听器的简单说明吗?

2 个答案:

答案 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/