Java中的自定义事件设计

Java中的自定义事件设计,java,events,Java,Events,我需要实现类来支持自定义事件,该事件能够根据事件类型传递不同类型/数量的数据。比如说, 对于事件类型A,我需要传递2个字符串名称。 对于事件类型B,我需要传递3个字符串名和一个double 我发现了两种设计: EventObject的扩展,包含所有可能数据的字段和方法(某些事件类型不需要的字段保留为空) EventObject的扩展,包含EventInfo对象的参数。EventInfo是更改信息的基类。触发特定事件的方法将传递包含必要更改信息的EventInfo子类(监听器需要向下转换) 还

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

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

我发现了两种设计:

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

  • EventObject的扩展,包含EventInfo对象的参数。EventInfo是更改信息的基类。触发特定事件的方法将传递包含必要更改信息的EventInfo子类(监听器需要向下转换)

  • 还有什么其他设计可以实现这一点?每种方法的优缺点是什么


    谢谢。

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

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

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

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

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

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

    如果您不介意尝试Scala,这就是“case”类的主要用途。您可以将其定义为:

    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
    是什么意思,但如果该类型是事件的类型,那么它可以只是一个类型化类

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


    上面的例子使用了AKKA的一小部分,但它不一定要使用,因为case类上的模式匹配是Scala的内置特性


    将以上内容视为看待您正在解决的问题的另一种方式。

    如果您不介意尝试Scala,这就是“case”类的主要用途。您可以将其定义为:

    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
    是什么意思,但如果该类型是事件的类型,那么它可以只是一个类型化类

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


    上面的例子使用了AKKA的一小部分,但它不一定要使用,因为case类上的模式匹配是Scala的内置特性


    将以上内容视为看待您正在解决的问题的另一种方式。

    3。将每个事件类型从基类事件类型+1到@GilbertLeBlanc的注释进行子类化-设计与例外情况相同,例外情况本质上是各种类型的事件。从基类事件类型+1到@GilbertLeBlanc注释,对每个事件类型进行子类化-设计与例外情况相同,例外情况本质上是各种类型的事件。