Java 中 C# 事件的替代项

2022-09-02 05:23:26

我是 .Net 开发人员。我想知道Java中是否有任何事件处理机制用于事件处理,如C#。

我想做的是我想在某种条件下从我的班级中引发/触发一个事件。和此类的使用者应注册该事件并编写事件处理方法。

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

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

任何人都可以帮我。


答案 1

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


答案 2

我喜欢 C# 事件,

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

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

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


事件.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));
    }
}
  • 您可能希望确保线程安全com.google.common.collect.Sets.newConcurrentHashSet()

事件参数.java

public class EventArgs {
}