Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中C#事件的替换_C#_Java_Events - Fatal编程技术网

Java中C#事件的替换

Java中C#事件的替换,c#,java,events,C#,Java,Events,我是.Net开发者。我想知道Java中是否有任何事件处理机制来处理像C#这样的事件 我想做的是,在某种条件下,我想在班上发起一个活动。此类的使用者应该注册该事件并编写事件处理方法 这在C#中很容易做到。我必须用Java实现这个东西 在谷歌搜索之后,我找到了一些链接,但所有这些都是关于AWT和swing中GUI事件的 有人能帮我吗。虽然大多数示例都与GUI事件有关,但原则基本相同。您基本上需要一个接口或抽象类来表示事件的处理程序,例如 public interface EventHandler {

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

我想做的是,在某种条件下,我想在班上发起一个活动。此类的使用者应该注册该事件并编写事件处理方法

这在C#中很容易做到。我必须用Java实现这个东西

在谷歌搜索之后,我找到了一些链接,但所有这些都是关于AWT和swing中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中的单方法接口非常相似,事件实际上只是一对添加/删除方法。

请检查。它介绍了一些在搜索中遇到的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()。此实现更多地是委托模型实现,而不是事件模型实现。