4

我需要在域模型中实现发布/订阅系统。我正在考虑使用 Guava 的 EventBus,但我想使用接口和适配器来让我的域模型不了解这样的实现细节。不幸的是,EventBus 对订阅注解的使用让这个想法很不爽。

有什么方法可以在不使用 @Subscribe 注释的情况下订阅处理程序?查看文档,似乎没有,但也许有些东西我没有看到。

谢谢!

4

2 回答 2

7

Guava 团队成员在这里。

你只能订阅一个带有@Subscribe注解的处理程序是很刻意的——EventBus旨在替换接口、适配器等,而不是补充它们——但是为什么你说它会暴露更多的实现细节呢?根据我们的经验,它通常会暴露较少的细节。

于 2012-04-18T22:09:34.243 回答
0

一种解决方法是调整 Handler。就像是:

class GuavaHandler<T extends Message> implements Handler<T> {
    private Handler<T> handler;

    public GuavaHandler(Handler<T> handler) {
        this.handler = handler;
    }

    @Override
    @Subscribe
    public void handle(T message) {
        try {
            handler.getClass().getMethod("handle", message.getClass());
            handler.handle(message);
        } catch (NoSuchMethodException ignored) {
            // workaround
        }
    }
}

您只需在此特定实现中定义属性。

于 2017-01-01T19:55:52.183 回答