1

CDIイベントでクラス継承を使用する方法はありますか?

私がこのようなものを持っているとしましょう:

public class ParentEvent{}

public class ChildEvent extends ParentEvent{}

そしてこのようなもの:

public class Manager(){
    @Inject 
    private Event<ParrentEvent> event;

    public void foo(){
        event.fire(new ParentEvent());
    }

    public void bar(){
        event.fire(new ChildtEvent());
    }        
}

public class Observer{

      public void observesParent(@Observes ParentEvent event){
          //do something
      }

      public void observesChild(@Observes ChildEvent event){
          //do something
      }
}

この場合、ParentEventとChildEventの両方がobservesParent()によって処理されます-Managerクラスのイベント属性のタイプが原因です。両方のオブザーバーメソッドでChildEventを監視する方法はありますか?

4

1 に答える 1

2

CDIの考え方は、(継承ではなく)イベント/オブザーバーと組み合わせて修飾子を使用することです。溶接ドキュメントのその章を確認してください。望ましい動作は、次のようなもので簡単に達成できるはずです。

public class Manager(){
    @Inject
    @Parent
    private Event<MyEvent> parentEvent;

    @Inject
    @Child
    private Event<MyEvent> childEvent; 

// ...

    public void foo(){
        event.fire(parentEvent);
    }

    public void bar(){
        event.fire(childEvent);
    }
}


public void observeChild(@Observes @Child MyEvent myEvent) { ... }
public void observeParent(@Observes @Parent MyEvent myEvent) { ... }
public void observeAll(@Observes MyEvent myEvent) { ... }

これは、継承を使用するよりもはるかに柔軟です...

于 2012-06-11T13:36:25.020 に答える