Java中的自定义事件设计

时间:2012-04-06 15:27:34

标签: java events

我需要实现类来支持能够根据事件类型传递不同类型/数量的数据的自定义事件。例如,

对于事件类型A,我需要传递2个字符串名称。 对于事件类型B,我需要传递3个字符串名称和一个双精度。

我发现了2个设计:

  1. EventObject的扩展,包含所有可能数据的字段和方法(某些事件类型不需要的字段留空)。

    // event constructors
    public MyEvent(Object source, int type, String a, String b) {}
    
    public MyEvent(Object source, int type, String a, String b, String c, double d) {}
    
  2. EventObject的扩展,包含EventInfo对象的参数。 EventInfo是更改信息的基类。触发特定事件的方法将传递包含必要更改信息的EventInfo的子类(需要监听器进行向下转换)。

    // event constructors
    public MyEvent(Object source, int type, EventInfo info) {}
    
    // base class for event info
    public class EventInfo {}
    
  3. 实现此目的还有哪些其他设计?各自的优点和缺点是什么?

    感谢。

2 个答案:

答案 0 :(得分:1)

一种常见的设计是在事件类中包含一个Map来保存参数以及一个字段来显示事件类型。因此,您的事件界面将如下所示:

public interface Event [
    public Object getParameter(String key);
    public void setParameter(String key, Object parameter);
    public String getType();
}

在事件处理程序类中,您可以使用getParameter()和getType()来检索事件的参数和事件类型。

答案 1 :(得分:0)

如果您不介意尝试Scala,那么这就是“案例”类主要用于的内容。您可以将它们定义为:

sealed trait SomeEvent
case class YourEvent( a: String, b: String ) extends SomeEvent
case class YourOtherEvent( a: String, b: String, c: String, d: Double  ) extends SomeEvent

然后您可以通过模式匹配在“事件处理器”中使用它们:

class EventProcessor extends Actor with ActorLogging {

  def receive = {

    case YourEvent( a: String, b: String ) =>

        // handle it    

    case YourOtherEvent( a: String, b: String, c: String, d: Double ) =>

        // handle it    

    case unknown => log.debug( "got an unknown event => " + unknown )
  }
}

不确定int type的含义,但如果是事件的类型,则可以只是一个类型化的类。

Object source可能类似于source: ActorRef,您实际上可以回复它,也不需要作为参数传递(如果使用Scala / AKKA,它会创建并保留该引用对你而言):

    case YourEvent( a: String, b: String, c: String, d: Double ) =>

        // handle it
        ...
        //reply to sender (e.g. source)
        sender ! YourReply( ... )

上面的示例使用了AKKA的一小部分,但它没有必要,因为案例类上的模式匹配是内置的Scala功能。

将上述视为以不同方式查看您正在解决的问题