c# - Java "events"- 只不过是接口(interface)。当它只是一个普通的接口(interface)和实现该接口(interface)的类时,为什么还要假装它是事件呢?

标签 c# java android

我主要在 .NET C# 中开发,我喜欢 C# 中的事件。

我现在正在做一些 Android 的东西,因此必须处理 Java。在将一些代码从 C# 移植到 Java 时,我遇到了事件的问题; Java 没有任何与 C# 事件相对应的东西。

因此,在阅读 Java 如何处理“事件”时,我唯一能得出的结论是它没有。 Java 中没有“事件”之类的东西。相反,他们使用实现这些接口(interface)的普通接口(interface)和类。

在 Java 中:
首先,您必须先创建接口(interface)
然后,所有想要监听“事件”的类都必须实现该接口(interface)。
然后,触发“事件”的类必须保留所有监听器的列表(某种数组)
然后,触发“事件”的类必须有一个方法,以便监听器可以将自己添加到数组中

当触发类决定“触发事件”时,它必须遍历监听器的数组,调用方法。

这只是简单的接口(interface)用法,而不是我世界中的事件。

我错了吗?

最佳答案

没有人在“伪装”。 Java 概念早在设计 C# 之前就已实现。 C# 中的事件在内部实际上是相同的。尽管它们对程序员来说更容易使用。也就是说,C# 事件变量维护一个事件订阅方法列表,订阅者可以从该列表中添加和删除方法引用。该事件为所属类提供了一种触发事件的方法。

无论如何,您对“事件”的定义是什么?这是一种旨在将一个类系统与另一个类系统分离的设计模式。在任何一种情况下(C# 或 Java),其他类都可以订阅接收事件通知,只是订阅和消息触发器的实现有所不同。

在 C# 中,您必须定义事件方法签名(委托(delegate))。这就是接口(interface)的作用。

C# 确实添加了 Java 所没有的功能,即您可以传递对方法的引用(delegate,尽管我现在知道这可能在 Java 7 中可用,至少在 JVM 级别)。由于这在 Java 中不存在,因此必须有另一种方法来提供必须是对象的事件(观察者设计模式)接收器,并且定义它的最佳方法是通过接口(interface) - 是的,您可以使用抽象类,但是这将严重限制收件人类型。

关于c# - Java "events"- 只不过是接口(interface)。当它只是一个普通的接口(interface)和实现该接口(interface)的类时,为什么还要假装它是事件呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2018212/

相关文章:

C# - 如何制作 'chance of success' 方法

c# - 根据基类的 Equals() 使派生类相等

c# - 以编程方式确定 ASP.NET/C# 网站是否已关闭

java - 无法从另一个 java 文件执行 java jar

android - QtCreator 构建 Android apk 失败,SDK 版本错误

c# - 从 Windows 服务加载 GUI 应用程序

java - 在 Scala 中,如何将 Spark 数据集映射到 POJO 列表?

java - 如何通过 JNI 将结构从 C 传回 Java

android - 如何分享ImageView的图片?

android - 如何使用 Espresso 测试 View 的分割?