Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Guava EventBus:订阅而不添加批注?_Java_Events_Guava - Fatal编程技术网

Java Guava EventBus:订阅而不添加批注?

Java Guava EventBus:订阅而不添加批注?,java,events,guava,Java,Events,Guava,我需要在域模型中实现一个发布/订阅系统。我曾考虑使用Guava的EventBus,但我希望使用接口和适配器使我的域模型不知道这样的实现细节。不幸的是,EventBus在订阅中使用注释的做法使这个想法遭到了猛烈的抨击 有没有办法不使用@subscribe注释就订阅处理程序?看看这些文件,似乎没有,但也许有些东西我没有看到 谢谢 这里是番石榴队的成员 非常谨慎的是,您只能使用@subscribe注释订阅处理程序--EventBus旨在替换接口、适配器等,而不是补充它们--但为什么您说这会暴露更多的实

我需要在域模型中实现一个发布/订阅系统。我曾考虑使用Guava的EventBus,但我希望使用接口和适配器使我的域模型不知道这样的实现细节。不幸的是,EventBus在订阅中使用注释的做法使这个想法遭到了猛烈的抨击

有没有办法不使用@subscribe注释就订阅处理程序?看看这些文件,似乎没有,但也许有些东西我没有看到


谢谢

这里是番石榴队的成员


非常谨慎的是,您只能使用
@subscribe
注释订阅处理程序--
EventBus
旨在替换接口、适配器等,而不是补充它们--但为什么您说这会暴露更多的实现细节?根据我们的经验,它通常会暴露较少的细节。

一个解决方法是调整处理程序。比如:

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
        }
    }
}
类GuavaHandler实现处理程序{ 私人经办人; 公共处理程序(处理程序){ this.handler=handler; } @凌驾 @订阅 公共无效句柄(T消息){ 试一试{ handler.getClass().getMethod(“handle”,message.getClass()); handler.handle(消息); }捕获(忽略NoSuchMethodException){ //变通办法 } } }
您只能在此特定实现中定义属性。

@OP:。感谢您的解释。我阅读了维基并同意使用@Subscribe是一种更好的方式(tm)。也就是说,我正在努力保持我的域模型干净,不受实现和基础设施细节的影响,即使是持久性注释和订阅注释以及订阅模式也是Guava独有的。我想在我的域中隐藏这一点,但我不同意,你可以利用Java8的lambdas并获得更干净的代码。我编写了一个小事件总线,您可以在这里找到它:但我仍然需要将它更新为Java8