Events CDI事件继承

Events CDI事件继承,events,java-ee-6,cdi,Events,Java Ee 6,Cdi,有没有一种方法可以将类继承用于CDI事件 假设我有这样的东西: public class ParentEvent{} public class ChildEvent extends ParentEvent{} public class Manager(){ @Inject private Event<ParrentEvent> event; public void foo(){ event.fire(new ParentEvent())

有没有一种方法可以将类继承用于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
      }
}
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) { ... }
像这样的:

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
      }
}
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) { ... }
公共类管理器(){
@注入
私人活动;
公共图书馆{
event.fire(newparentevent());
}
公共空白栏(){
event.fire(new ChildtEvent());
}        
}
公共类观察员{
public void observesParent(@Observes ParentEvent事件){
//做点什么
}
public void observesChild(@Observes ChildEvent事件){
//做点什么
}
}

在这种情况下,ParentEvent和ChildEvent都由observesParent()处理-这是由于Manager类中的事件属性类型所致。是否有一种方法可以同时使用两种观察者方法观察ChildEvent

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
      }
}
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) { ... }
公共类管理器(){
@注入
@母公司
私人事件;
@注入
@孩子
私人活动;
// ...
公共图书馆{
事件。火灾(家长事件);
}
公共空白栏(){
事件。火灾(儿童事件);
}
}
public void observeChild(@Observes@Child MyEvent MyEvent){…}
public void observeParent(@Observes@Parent MyEvent MyEvent){…}
public void observeAll(@Observes MyEvent MyEvent){…}

这比使用继承更灵活…

我建议您的CDI事件是不可变的和最终的,以避免任何意外。我不确定允许通过任何方式(继承或其他方式)修改行为是否是一个好主意。主要问题是,您不能用限定或泛型事件抽象观察(我是指观察者方面)机制。我们希望能够做到这一点,例如,提供应用程序业务层使用的某种框架。