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’开头,而应该是过去时 – mouseMoved
或handshakeCompleted
而不是onMouseMove
或handleMouseMove
。
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事件处理内容,但这些概念非常普遍。 简单来说,事件处理程序维护一组侦听器(实现一个接口),并在它们触发事件时迭代它们,在接口中调用该方法。