最佳实践-将事件声明为Java接口的一部分

最佳实践-将事件声明为Java接口的一部分,java,events,Java,Events,我正在尝试使用接口和事件来解耦一些UI代码,我想知道Java中是否有将事件声明为Java接口的一部分的方法/最佳实践—类似于C#提供的: // C# event declaration in interface public interface IAction { event EventHandler OnAction; } 我的目标只是标记一个接口,以便它(实现者)触发特定类型的事件。我希望我能包含更多的文档,只是为了强制执行这种行为。我意识到Java没有提供“event”关键字,也

我正在尝试使用接口和事件来解耦一些UI代码,我想知道Java中是否有将事件声明为Java接口的一部分的方法/最佳实践—类似于C#提供的:

// C# event declaration in interface
public interface IAction
{
    event EventHandler OnAction;
}
我的目标只是标记一个接口,以便它(实现者)触发特定类型的事件。我希望我能包含更多的文档,只是为了强制执行这种行为。我意识到Java没有提供“event”关键字,也没有提供直接的方法,所以我希望能得到一些解决方法或实现这一点的最佳实践方面的建议

我可以考虑这样做的一种方法是创建一个表示触发事件能力的通用标记接口:

public interface FiresEvent<T extends Event> {
    public void fireEvent();
}
公共接口FiresEvent{
公共事件();
}
。。。然后在自定义接口中继承该接口

public interface MyInterface extends FiresEvent<ActionEvent> {

}
公共接口MyInterface扩展FiresEvent{
}
这种方法的问题是,“FiresEvent”只能被继承一次,即使泛型类型发生变化,因此对于对象可能是多个事件源的情况,解决方案似乎不够泛型

我很想知道人们会如何处理这个问题,以及是否有比记录触发事件的需要更好的方法

编辑: 也许以下几点可以澄清我的问题:

我通过允许调用方针对对象注册处理程序来理解Java处理程序列表方法和自我处理。在我的例子中,我依赖于一个事件总线,因此我们可以将“触发”事件视为将它们放在那里,以便将其他内容重定向到处理程序

我想将接口责任定义为:

  • 接口实现者向world/event bus/anything中触发T类型的事件
  • 接口实现者不必委托给注册的侦听器本身

Java处理事件的方式与您习惯的稍有不同,但概念是相同的。您创建了一个事件监听器,当事件发生时就会调用它。这是一个更好的构造,因为它允许注册多个侦听器


我建议浏览此

方法的存在

 registerXListener(XListener listener)
在接口中,表示类将向关心的人发送XEvents。也就是说,“标记”只是另一种方法。我认为最接近C#习惯用法的类似方法是将该方法提升到一个接口中,如

public interface XEventFirer 
{
    public void registerXListener(XListener listener)
}

这似乎是一个使用注释的自然场所。我遇到过一种使用注释来发布和订阅事件的方法。这种方法自然是自文档化的,并且取决于它的实现方式,它可以使您的代码更具可读性,并且可能允许您强制执行注释。

我对Java事件感到满意,我的问题是关于指定接口应抛出事件的最佳实践。您的意思是这样吗?Java不触发事件,它调用已注册的侦听器。所以,如果你想模仿C#模型,你需要调用注册的监听器。另一个库(在这类事情上比EventBus更安全)是GUTS events-@Kevin,这是一个很好的信息…我想我会读Guice,从来没有听说过。听起来这个包可以完成OP想要的大部分功能,但看起来它并不适合标记事件触发程序,至少在类级别上是这样。如果我感到困惑,请帮助我。你是对的-它没有标记消防员的设施。。。老实说,我不太确定我是否遵循了做这类事情的要点——如果您使用的是事件总线,那么您最不想做的就是担心事件从何而来。我从未真正理解需要所有这些额外的非功能性注释,但这可能是我缺乏想象力的缘故。使用注释来标记消费者是有意义的,因为它允许DI框架传递消息并减少了大量的boilerplate.PS-GUICE本身就是由Google创建的DI框架。GUTS是一个构建在GUICE之上的框架,用于提供事件总线和灵活的富客户端功能。是的,我(一直在尝试)从你前几天发布的链接中读到了它。我没有太多的编程工作,所以我对热门设计模式一无所知。我对DI一点也不熟悉…谢谢你教育我。