我正在尝试使用接口和事件来分离一些UI代码,我想知道Java中是否有方法/最佳实践将事件声明为Java接口的一部分 - 就像C#提供的那样: / p>
// C# event declaration in interface
public interface IAction
{
event EventHandler OnAction;
}
我的目标只是标记一个接口,以便知道它(实现者)触发特定类型的事件。我希望我只能包含更多文档来强制执行该行为。我意识到Java不提供“事件”关键字或直接这样做的方式,因此我希望就解决方法或实现此目的的最佳实践提供一些建议。
我能想到的一种方法是创建一个通用标记接口来表示触发事件的能力:
public interface FiresEvent<T extends Event> {
public void fireEvent();
}
...然后在我的自定义界面中继承该界面。
public interface MyInterface extends FiresEvent<ActionEvent> {
}
这种方法的问题是“FiresEvent”只能继承一次,即使泛型类型发生了变化,因此对于对象可能是多个事件源的情况,该解决方案似乎不够通用。
我很想知道人们会如何处理这个问题,如果有更好的方法,只需记录发射事件的必要性。
修改 也许以下内容将澄清我的问题:
我理解Java处理程序列表方法和自我处理,允许调用者针对对象注册处理程序。在我的情况下,我依赖于事件总线,因此我们可以将“触发”事件视为将它们放在那里,以便将其他内容重定向到处理程序。
我想将界面责任定义为:
答案 0 :(得分:4)
Java处理事件的方式与您习惯的方式略有不同,但概念是相同的。您可以创建所谓的事件侦听器,并在事件发生时调用它。这可以是更好的构造,因为它允许注册多个侦听器。
我建议浏览此tutorial
答案 1 :(得分:2)
存在方法
registerXListener(XListener listener)
界面中的表示一个类会向关心的人发送XEvents。也就是说,'标记'只是另一种方法。 C#习惯用法的最近模拟(我认为)是将该方法提升到接口,如
public interface XEventFirer
{
public void registerXListener(XListener listener)
}
答案 2 :(得分:2)
这似乎是使用注释的自然场所。我遇到了EventBus,它使用注释来发布和订阅事件。这种方法自然是自我记录的,并且取决于它的实现方式可以使您的代码更具可读性,并且可以允许您强制执行注释。