繁体   English   中英

Java中的事件侦听器

[英]Event listener in java

我们使用基类和事件侦听器方法设计应用程序,从而使用基类和事件侦听器接口。 基类在调用任何操作后调用适当的事件侦听器方法。 以下代码显示了我的设计:

import java.util.EventListener;

public interface MyEventListener extends EventListener
{
    public void preOperation();

    public void postOperation();
}

然后,我实现此接口,如下所示:

class MyEventListenerImpl implements MyEventListener
{
    @Override
    public void postOperation()
    {
        System.out.println("Do previous operation");
    }

    @Override
    public void preOperation()
    {
        System.out.println("Do post operation");
    }
}

然后,我将基类编写如下:

abstract class Base
{
    private MyEventListener eventListener; /* this member injected */

    public abstract void operation_1();

    public void doOperation_1()
    {
        eventListener.preOperation(); /* call listener before invoking main operation_1 implementation */

        operation_1(); /* call main operation_1 implementation */

        eventListener.postOperation(); /* call listener after invoking main operation_1 implementation */
    }
}

完成这些工作后,我将编写我的Base类的实现并实现operation_1方法。 我通过java.util.EventListener标记接口执行此方法,但是在设计我的问题后,请参见另一个类:

  1. java.util包中的抽象类EventListenerProxy
  2. org.apache.commons.lang3.event包中的EventListenerSupport通用类。

我不知道永远不要使用这些类。 我想知道两件事:

  1. 您对我的设计的看法(好坏)
  2. 事件侦听器方法的最佳实践(通过所述类或任何第三方框架)

在不知道应该解决哪个问题的情况下,很难讨论特定的设计。

无论如何,设计的主要问题是只能有一个监听器。 使用EventListenerSupport可以轻松支持多个方法,并且可以轻松实现添加/删除侦听器方法。

另一个问题是您的侦听器方法不将任何事件作为参数。 这使得单个侦听器无法侦听多个Base实例,因为它无法使用事件检测事件的来源。

本质上,EventListener不知道发生什么事情,因为它是从示例中的operation_1内部触发的。

您正在寻找的是AOP方法拦截器。 特别是aopalliances的MethodInterceptor接口将对您有用:

public Operation1Interceptor implements MethodInterceptor {

  Object invoke(MethodInvocation invocation) throws Throwable {

    /* feel free to access the arguments, if you wish */
    foo(invocation.getArguments())

    Object retval = invocation.proceed();

    /* Log it or do whatever you want */
    bar(retval);

    baz();

    return retval;
  }

}

最简单的使用方法是Google Guice,但这里有一些教程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM