我主要在 .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/