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