我们的Java应用程序在后端使用Google Guava EventBus进行通信。其中一些事件使用Jersey的server-sent eventssupport发送到客户端,以启用通知。客户端只对某些类型的事件感兴趣,并且这些事件以JSON格式发送到客户端。
目前,我们正在使用
这段代码在系统添加越来越多的事件时变得混乱。经过一些研究,有一些替代方案但都不够好。
1)反射。
使用反射意味着我们可以使用声明性方式从事件对象中检索数据而不知道确切的类型。但使用反射不是类型安全的,在处理嵌套路径时可能会很混乱,例如
2)多态性
多态看起来是 instanceof 的一个很好的替代品,但在这种情况下真的有效吗?使用多态意味着向 UIEvent 接口添加像
3)包装类
我还考虑使用事件包装类来封装单独的类中的 JSON 主体构建逻辑。然后在事件总线的
目前,我们正在使用
if-else
和instanceof
处理JSON体生成的巨大方法。 UIEvent
仅用作过滤器的标记接口。@Subscribe
public void handleEvent(final UIEvent event) {
if (event instanceof A) {
A a = (A) event;
} else if (event instance B) {
B b = (B) event;
} ...
}
这段代码在系统添加越来越多的事件时变得混乱。经过一些研究,有一些替代方案但都不够好。
1)反射。
使用反射意味着我们可以使用声明性方式从事件对象中检索数据而不知道确切的类型。但使用反射不是类型安全的,在处理嵌套路径时可能会很混乱,例如
a.b.c
。2)多态性
多态看起来是 instanceof 的一个很好的替代品,但在这种情况下真的有效吗?使用多态意味着向 UIEvent 接口添加像
toJSON
这样的方法。但这会逆转依赖流并将 UI 详细信息暴露给事件总线。3)包装类
我还考虑使用事件包装类来封装单独的类中的 JSON 主体构建逻辑。然后在事件总线的
handleEvent
方法中,我可以获取事件对象的类型,并使用命名约定找到包装类,然后构造包装类实例,调用 toJson
方法以获取 JSON 主体。public class AWrapper {
public AWrapper(A a) {
}
public Object toJson() {
}
}
这是我可以想到的最合理的方法。
需要建议和想法。
toJson
这样的方法会将你锁定在使用 json 上。另一个解决方案是添加一个返回通用数据属性集合(例如Map<String, Object>
)的方法,然后使用它来序列化为 json。 - Jorn VerneehandleEvent()
中使用反射来检查注解是否存在。 - Mick MnemonicIAdaptableFactory
和IAdapterManager
类型。该模式可用于将事件类型适应为可序列化到所选格式的类型,而无需在事件类中添加其他职责。 - erickson