Java中C#事件的替代

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

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

这可以在C#中轻松完成。 我必须用Java实现这个东西。

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

谁能帮我吗。

虽然大多数示例都与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中的单方法接口非常相似,而事件实际上只是一对添加/删除方法。

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

Observable对象有一个实现Observer接口的观察者列表,以及添加和删除观察者的机制。 如果在observable上调用o.notifyObservers(x) update(o,x)则将在每个观察者上调用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’开头,而应该是过去时 – mouseMovedhandshakeCompleted而不是onMouseMovehandleMouseMove

PropertyChangeSupport类提供了从bean添加和删除侦听器的机制的实现,也用于Swing小部件的属性。

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

我喜欢C#Events,

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

  • 使用java 8(用于lambdas)
  • 没有+=运算符,而是调用.addListener((x) -> ...)
  • 要触发事件,请调用.broadcast()

在线演示 – 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> listeners = new HashSet(); public void addListener(Consumer listener) { listeners.add(listener); } public void broadcast(EventArgs args) { listeners.forEach(x -> x.accept(args)); } } 
  • 您可能需要com.google.common.collect.Sets.newConcurrentHashSet()来保证线程安全

EventArgs.java

 public class EventArgs { } 

看看这个教程 。 它会介绍您在搜索中遇到的一些Swing事件处理内容,但这些概念非常普遍。 简单来说,事件处理程序维护一组侦听器(实现一个接口),并在它们触发事件时迭代它们,在接口中调用该方法。