2012-04-18 82 views
3

我需要在域模型中實現發佈/訂閱系統。我正在考慮使用Guava的EventBus,但我想使用接口和適配器來保持我的領域模型不知道這樣的實現細節。不幸的是,EventBus使用註釋進行訂閱會讓這個想法變得很糟糕。番石榴EventBus:訂閱沒有註釋?

有什麼辦法可以訂閱處理程序而不使用@Subscribe註解?看着文檔,似乎沒有,但也許有一些我沒有看到。

謝謝!

回答

6

番石榴團隊成員在這裏。

這是很刻意的,你只能訂閱的處理程序與@Subscribe註釋 - EventBus旨在取代接口,適配器等,不以補充他們 - 但你爲什麼說公開更多實施細節?根據我們的經驗,它通常暴露的細節較少。

+0

@OP:[看這裏](http://stackoverflow.com/questions/8985875/annotations-vs-interface-in-guava-eventbus)。 – Xaerxess 2012-04-19 08:13:53

+0

感謝您的解釋。我閱讀了Wiki並同意使用@Subscribe是一種更好的方法(tm)。也就是說,我正努力保持我的域模型清潔並且免於實現和基礎設施細節,即使是持久性註釋,訂閱註釋和訂閱模式也是Guava獨有的。我想試圖從我的域名中隱藏這個。 – HolySamosa 2012-04-19 13:59:53

+0

我不同意,你可以利用Java 8的lambda表達式,並有一個更清晰的代碼。我寫了一個小型的事件總線,你可以在這裏找到:https://github.com/jamming/dojo/tree/master/museum/src/main/java/co/popapp/bus我仍然需要將它更新到Java 8 – jamming 2015-12-20 18:53:39

0

解決方法是修改處理程序。例如:

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 
     } 
    } 
} 

您只在此特定實現中定義屬性。