在我的应用程序中,我有一个eventbus分发来自外部的消息。我想分发这些消息,包括一些Controldata。我想要使用的对象是这样的
class NewMessage<MESSAGE_TYPE> {
MESSAGE_TYPE message;
Controldata controldata;
}
因为我无法订阅通用
NewMessage<MyMessage>
我创建了一个解决方法
class MyMessage extends Controldata {
}
所以我可以订阅MyMessage
。另一种解决方案是为每条消息创建一个新的包装类。
但是我不喜欢这两种解决方案。一个因为MyMessage不是Controldata,另一个意味着很多oehead。任何想法如何干净利落地解决这个问题?
答案 0 :(得分:0)
选择不多。如果您希望能够订阅不同的消息类型,但这些类型不包含数据,那么在外部存储数据可以起作用:
private static Map<Object, ControlData> controlDataMap =
Collections.synchronizedMap(new WeakHashMap<>());
public void publish(Object message, ControlData data) {
controlDataMap.put(message, data);
bus.post(message);
}
@Subscribe void foo(SomeMessage msg) {
ControlData data = controlDataMap.get(msg);
// do things.
}
地图的清理是自动的(只要事件在处理完事件后被垃圾收集),但在gc压力下可能无法正常工作。
第二个限制:事件对象必须是唯一的,并且必须具有理智的等于/ hashcode实现。
除此之外,你可以编写自己的事件总线实现/扩展guava给你的东西。不幸的是,这不是最灵活的公共汽车。