Java"事件" - 仅仅是接口.当它只是一个普通的接口和实现该接口的类时,为什么假装它是事件?

Ted*_*Ted 1 c# java android

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

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

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

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

当触发类决定"触发事件"时,它必须遍历侦听器的数组,调用方法.

这只是简单的界面使用,而不是我世界中的事件.

我错了吗?

Kev*_*ock 5

没有人"假装".Java概念早在C#设计之前就已实现.C#中的事件内部真的是一样的; 虽然它们更容易让程序员使用.也就是说,C#事件变量维护一个事件订阅方法列表,订阅者可以添加和删除该列表中的方法引用.该事件为拥有类提供了触发事件的方法.

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

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

Java没有的C#所做的就是你可以传递对方法的引用(delegate虽然我现在明白这可能在Java 7中可用,至少在JVM级别可用).由于Java中不存在这种情况,因此必须有另一种方法来提供必须是对象的事件(观察者设计模式)接收器,并且通过接口定义它的最佳方法 - 是的,您可以使用抽象类,但是这将严重限制收件人类型.

  • @Ted - 我认为说Java没有事件是误导性的,但.net确实当你真正的意思是Java没有事件关键字但.net确实如此.仅仅因为不同的语言有不同的方式来实现标准模式(Java使用接口,.net使用事件关键字)并不意味着他们不能支持这些模式. (2认同)