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

4

我正在试图使用接口和事件解耦一些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();
}

......然后在我的自定义接口中继承该接口。

public interface MyInterface extends FiresEvent<ActionEvent> {

}

这种方法的问题在于,“FiresEvent”只能被继承一次,即使泛型类型改变,因此该解决方案似乎不够通用,不能处理一个对象可能是多个事件源的情况。
我很想知道人们会如何处理这个问题,是否有比仅仅记录需要触发事件更好的方法。
编辑: 也许以下内容可以澄清我的问题:
我理解Java中处理程序列表的方法和自我处理,通过允许调用者针对对象注册处理程序。在我的情况下,我依赖于事件总线,因此我们可以将“触发”事件视为将它们放在外面,以便其他内容重定向到处理程序。
我想定义接口责任为: 1. 接口实现者向世界/事件总线/任何地方触发类型为T的事件 2. 接口实现者不必自己委托给已注册的听众。
3个回答

4

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

我建议浏览这个教程


我对Java事件很熟悉,我的问题是关于在指定接口应该抛出事件方面的最佳实践。 - filip-fku
你是指像这样吗?http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Core/beans/java/beans/PropertyChangeListener.java.htm - Preston
Java不会触发事件,而是调用已注册的监听器。因此,如果您想模仿C#模型,就需要调用已注册的监听器。 - Preston

2
存在一个方法
 registerXListener(XListener listener)

在接口中,in关键字表示一个类会向关心它的对象发送XEvents事件。也就是说,“标记”只是另一种方法。这个C#惯用语最接近的类比(我认为)是将该方法提升到一个接口中,例如

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

2

这似乎是使用注解的自然场所。我遇到过EventBus,它使用注解来发布和订阅事件。这种方法天然具有自我记录特性,并且根据实现方式的不同,它可以使您的代码更易读,可能还可以让您强制使用注解。


1
另一个比EventBus更类型安全的库是GUTS-events - http://kenai.com/projects/guts/pages/Home。 - Kevin Day
@Kevin 这是很好的信息...我想我会研究一下Guice,从未听说过。看起来这个包将完成大部分OP想要的功能,但似乎不太适合在类级别上标记事件触发器。如果我有误,请帮助我理清思路。 - Keith Layne
你是正确的 - 它没有标记发起者的功能...老实说,我不太确定做这种事情的意义所在 - 如果你正在使用事件总线,你最不想担心的就是事件来自哪里。我从来没有真正理解所有这些额外的非功能性注释的必要性,但这可能是我缺乏想象力的原因。使用注释标记消费者是有意义的,因为它允许DI框架传递消息并减少了很多样板文件。 - Kevin Day
PS - GUICE本身是由Google创建的DI框架。GUTS是在GUICE基础上构建的框架,旨在提供事件总线和流畅的丰富客户端功能。 - Kevin Day
是的,我已经从你几天前发布的链接中尝试阅读了相关内容。由于我没有太多编程经验,所以对于热门设计模式并不了解。我之前完全不熟悉 DI,感谢你让我学到了新知识。 - Keith Layne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接