Java中C#事件的替代

Moh*_*san 15 c# java events

我是.Net开发人员.我想知道Java中是否有像C#这样的事件处理的事件处理机制.

我想要做的是我想在某些条件下从我的班级中筹集/开火.此类的消费者应该注册该事件并编写事件处理方法.

这可以在C#中轻松完成.我必须用Java实现这个功能.

谷歌搜索后我找到了一些链接,但所有这些都在谈论AWT和摇摆中的GUI事件.

谁能帮我吗.

Jon*_*eet 28

虽然大多数示例都与GUI事件有关,但原理基本相同.您基本上需要一个接口或抽象类来表示事件的处理程序,例如

public interface EventHandler
{
    // Change signature as appropriate of course
    void handleEvent(Object sender, EventArgs e);
}
Run Code Online (Sandbox Code Playgroud)

然后该活动的发布者将:

public void addEventHandler(EventHandler handler)
public void removeEventHandler(EventHandler handler)
Run Code Online (Sandbox Code Playgroud)

它可以保留事件处理程序本身的列表,也可以将它们封装在可重用的类型中.然后,当事件发生时,您只需handleEvent依次调用每个处理程序.

您可以将C#中的委托类型视为与Java中的单方法接口非常相似,而事件实际上只是一对添加/删除方法.

  • 现在Java 8已经出来了,在“Consumers”和FunctionalInterfaces的帮助下,是否可以有更好的设计呢? (2认同)
  • @Sisir:接口始终旨在充当委托。事件发布者上的方法(“addEventHandler”和“removeEventHandler”)是事件部分。例如,他们可以在内部使用“List<EventHandler>”。但实际上,在这一点上,如果您能提出一个新问题,表明您已经取得了多大的进展以及您仍然面临的具体问题,那将是最好的。 (2认同)

Jos*_*ush 10

我喜欢C#Events,

它们使用简单,方便.我在java中错过了它们所以写了一个小实用程序类,它模仿了C#的基础知识Event.

  • 使用java 8(用于lambdas)
  • 没有+=操作员,而是打电话.addListener((x) -> ...)
  • 要触发一个事件,请致电 .broadcast(<EventArgs insance>)

在线演示 - https://repl.it/DvEo/2


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));
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 您可能需要com.google.common.collect.Sets.newConcurrentHashSet()线程安全

EventArgs.java

public class EventArgs {
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*ham 7

Java通过各种事件处理实现提供支持 - java.util中的简单Observer/Observable ,java.beans 中的PropertyChangeEvent以及从AWTEvent继承的GUI事件.

一个可观察对象具有实现观察者的列表观察员用于添加和删除观察员接口和机制.如果o.notifyObservers(x)在observable update(o,x)上调用,则会在每个观察者上调用.这种机制在某种程度上是老式的,很少用在新代码中 - 它在Java 1.1中添加EventObject之前就是Java 1.0,并且为AWT和bean添加了更好的事件处理.

Bean和GUI事件传播一个对象,该对象将java.util.EventObject扩展到实现EventListener子接口的侦听器.通常,如果您使用的是现有API,则只关注该API的事件和侦听器,但如果您要定义API,则事件和侦听器应遵循该约定.

它也是Java API中的约定,用于调用事件"侦听器"而不是处理程序的处理程序,并且所有侦听器接口名称都以此结束Listener.方法的名称不是以'on'开头,而应该是过去时 - mouseMoved或者 handshakeCompleted不是onMouseMovehandleMouseMove.

所述的PropertyChangeSupport类提供机构用于从豆中添加和删除侦听器的实现,并且也用于Swing小部件的性能.

如果您编写自己的侦听器处理,那么允许侦听器通过source.removeXXXListener(this)在其事件处理方法中调用来移除自己是常规的.只需迭代一个简单的侦听器集合并调用它们的处理方法就可以ConcurrentModificationException在这些情况下提供 - 您需要复制侦听器集合或使用可同时修改的集合.