Java中C#事件的替换
我是.Net开发者。我想知道Java中是否有任何事件处理机制来处理像C#这样的事件 我想做的是,在某种条件下,我想在班上发起一个活动。此类的使用者应该注册该事件并编写事件处理方法 这在C#中很容易做到。我必须用Java实现这个东西 在谷歌搜索之后,我找到了一些链接,但所有这些都是关于AWT和swing中GUI事件的Java中C#事件的替换,c#,java,events,C#,Java,Events,我是.Net开发者。我想知道Java中是否有任何事件处理机制来处理像C#这样的事件 我想做的是,在某种条件下,我想在班上发起一个活动。此类的使用者应该注册该事件并编写事件处理方法 这在C#中很容易做到。我必须用Java实现这个东西 在谷歌搜索之后,我找到了一些链接,但所有这些都是关于AWT和swing中GUI事件的 有人能帮我吗。虽然大多数示例都与GUI事件有关,但原则基本相同。您基本上需要一个接口或抽象类来表示事件的处理程序,例如 public interface EventHandler {
有人能帮我吗。虽然大多数示例都与GUI事件有关,但原则基本相同。您基本上需要一个接口或抽象类来表示事件的处理程序,例如
public interface EventHandler
{
// Change signature as appropriate of course
void handleEvent(Object sender, EventArgs e);
}
那么活动的发布者将拥有:
public void addEventHandler(EventHandler handler)
public void removeEventHandler(EventHandler handler)
它要么保留事件处理程序本身的列表,要么可能将它们封装在可重用类型中。然后,当事件发生时,您只需依次在每个处理程序中调用handleEvent
您可以认为C#中的委托类型与Java中的单方法接口非常相似,事件实际上只是一对添加/删除方法。请检查。它介绍了一些在搜索中遇到的Swing事件处理的内容,但是这些概念非常一般。简单地说,事件处理程序维护一组监听器(实现一个接口),并在触发事件时对其进行迭代,调用接口中的方法。Java通过各种事件处理实现得到支持-Java.util中的简单观察者/可观察者,Java.beans中的s,以及从AWTEvent继承的GUI事件 对象具有实现接口的观察者列表,以及用于添加和删除观察者的机制。如果对可观察对象调用了
o.notifyobservators(x)
,则将对每个观察者调用update(o,x)
。这种机制有些过时,很少在新代码中使用-它可以追溯到Java 1.0,在Java 1.1中添加EventObject之前,并且为AWT和Bean添加了更好的事件处理
bean和GUI事件传播一个对象,该对象扩展到实现的子接口的侦听器。通常,如果您使用的是现有的API,那么您只关心该API的事件和侦听器,但是如果您定义的是API,那么事件和侦听器应该遵循该约定
Java API中的惯例也是将事件的处理程序调用为“侦听器”,而不是调用处理程序,并且所有侦听器接口名称都以listener
结尾。方法的名称不以“on”开头,但应为过去时-mouseMoved
或handshakeCompleted
,而不是onMouseMove
或handleMouseMove
该类提供了一种机制的实现,用于在bean中添加和删除侦听器,还用于Swing小部件的属性
如果您编写自己的侦听器处理,通常允许侦听器通过在其事件处理方法中调用source.removeXXXListener(this)
来删除自己。在这些情况下,只需迭代一个简单的侦听器集合并调用其处理方法就会产生一个ConcurrentModificationException
,您需要复制侦听器集合或使用一个可并发修改的集合。I love C#Events,
它们使用简单方便。我在java中错过了它们,因此编写了一个小型实用程序类,它模仿了C#事件
的基本原理
- 使用Java8(用于lambdas)
- 没有
操作符,而是调用+=
.addListener((x)->…)
- 要触发事件,请调用
.broadcast()
Event.java
import java.util.HashSet;
import java.util.Set;
import java.util.function.Consumer;
public class Event {
private Set<Consumer<EventArgs>> listeners = new HashSet();
public void addListener(Consumer<EventArgs> listener) {
listeners.add(listener);
}
public void broadcast(EventArgs args) {
listeners.forEach(x -> x.accept(args));
}
}
public class EventArgs {
}
看到了吗,现在Java 8已经面世了,在
消费者
和功能接口的帮助下,有没有更好的设计呢?@Sisir:我认为在这里模仿C的需求不多,老实说,实际上我正在使用android,在这里有很多地方可以使用类似C#的事件,例如,从AsyncTask返回值到UI,从列表项调用单击侦听器etc@Sisir:在这种情况下,您有一个非常具体的用例,因此我建议您采纳这个答案的想法,并将其应用于具体情况。虽然说实话,我真的建议使用其他Android代码使用的习惯用法。@Sisir:接口总是要充当委托。事件发布服务器上的方法(addEventHandler
和removeventhandler
)是事件部分。例如,他们可以在内部使用列表。但实际上,在这一点上,如果你能提出一个新问题,说明你已经取得了多大的进步以及你仍然面临的具体问题,那就最好了。除此之外,broadcast()。此实现更多地是委托模型实现,而不是事件模型实现。