2012-04-18 3 views
3

도메인 모델 내에서 pub/sub 시스템을 구현해야합니다. Guava의 EventBus 사용에 대해 생각하고 있었지만 인터페이스 및 어댑터를 사용하여 내 도메인 모델이 그러한 구현 세부 사항을 알지 못하게하고 싶습니다. 불행하게도, EventBus의 구독에 대한 주석 사용은이 아이디어에서 원숭이 렌치를 던집니다.Guava EventBus : 특수 효과가없는 구독?

@Subscribe 주석을 사용하지 않고 처리기를 구독 할 수있는 방법이 있습니까? 문서를 살펴보면, 보이지 않는 것 같지만 아마도 내가 보지 못하는 것이있을 것입니다.

감사합니다.

답변

6

Guava 팀 멤버가 여기 있습니다.

그것은 당신 만 @Subscribe 주석 핸들러를 등록 할 수있는 매우 의도적이다 - EventBus는 등 인터페이스 어댑터를 교체를 보완하지 에 것입니다 -하지만 당신은 그더 많은 노출 말을 왜 구현 세부 사항? 우리의 경험에 따르면, 일반적으로 적은 수의 세부 사항을 노출합니다.

+0

@OP : [여기를보십시오] (http://stackoverflow.com/questions/8985875/annotations-vs-interface-in-guava-eventbus). – Xaerxess

+0

설명해 주셔서 감사합니다. 나는 위키를 읽고 @Subscribe의 사용이 더 나은 길 (tm)이라는 것에 동의한다. 즉, 도메인 모델을 깨끗하게 유지하고 구현 및 인프라 세부 정보, 심지어 지속성 주석 및 구독 주석 및 가입 패턴이 Guava만의 고유성을 유지하도록 노력하고 있습니다. 내 도메인에서이를 숨기려고했습니다. – HolySamosa

+0

Java 8의 람다 (lambda)를 이용하고 코드를보다 깨끗하게 만들 수 있다는 것에 동의하지 않습니다. 작은 이벤트 버스를 썼습니다 : https://github.com/jamming/dojo/tree/master/museum/src/main/java/co/popapp/bus 아직 Java 8로 업데이트해야합니다. – jamming

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

이 특정 구현에서만 속성을 정의합니다.