Eventbus和Controldata

时间:2015-10-08 13:23:19

标签: java guava event-bus

在我的应用程序中,我有一个eventbus分发来自外部的消息。我想分发这些消息,包括一些Controldata。我想要使​​用的对象是这样的

class NewMessage<MESSAGE_TYPE> {
  MESSAGE_TYPE message;
  Controldata controldata;
}

因为我无法订阅通用

NewMessage<MyMessage>

我创建了一个解决方法

class MyMessage extends Controldata {
}

所以我可以订阅MyMessage。另一种解决方案是为每条消息创建一个新的包装类。

但是我不喜欢这两种解决方案。一个因为MyMessage不是Controldata,另一个意味着很多oehead。任何想法如何干净利落地解决这个问题?

1 个答案:

答案 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给你的东西。不幸的是,这不是最灵活的公共汽车。