在java项目中使用EventBus的优缺点
在java项目中,如果不是swing,当要用到事件、通知机制的时,时下最流利的、最简单的方式就是使用
google的guava-EventBus,它简洁、强大、使用方便,最大多数开源爱好者的首选。
使用EventBus的好处有:
1.EventBus简洁、强大
2.不用写回调接口
3.可以组件、线程间的相互通信
但是,它也有缺点。比如,事件的处理(侦听)是通过方法的参数类型来确定的。当在项目中,当大量使用EventBus时,跟踪和定位问题,是一件很痛苦的事。我们知道,事件的三要素有:事件源、事件状态、事件处理者。即当某个事件源的某个状态发生变化时,事件的处理者侦听到了,会做出相应的处理。而EventBus的注册事件,仅通过EventBus.register()来注册。当一个事件有N个侦听者时,EventBus.register()会分布在项目的N个角落,而且当有N种事件时,这种情况就变得更加恐怖了。当定位问题,无法确定一个事件会有多少个侦听者,因为,你无法知道项目中有多少个register(),并且有多少个方法的参数与post()的参数的类型一致。
相比之下,javascript和actionscript的事件处理,就友好得多了。如: btn.addEventListener(MouseEvent.CLICK,onClickHandler);这一行代码,就能表达事件的三要素。事件源是btn,事件状态是click,事件的处理者是onClickHandler函数。非常好定位问题。即使通过javascript和actionscript来实现google的EventBus这种全局事件,也可以通过事件状态来快速定位,事件侦听者是谁、有几个事件侦听者。
个人感觉,google的EventBus更适合用在android项目中,特别是在Activity间的通信。传统项目似乎还是大不好,还是通过回调接口,或观察者模式来实现。因为更直观、更好跟踪和定位问题。