【问题标题】:CDI events inheritanceCDI 事件继承
【发布时间】:2012-06-10 21:56:46
【问题描述】:

有没有办法通过 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 ?

【问题讨论】:

  • 我建议您的 CDI 事件是不可变的和最终的,以避免任何意外。我不确定允许通过继承或其他方式修改行为是否是个好主意。

标签: events java-ee-6 cdi


【解决方案1】:

CDI 的想法是将限定符与事件/观察者结合使用(而不是继承)。检查焊接文档中的that chapter。所需的行为应该可以通过以下方式轻松实现:

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) { ... }

这比使用继承要灵活得多...

【讨论】:

  • 主要问题是你不能用合格的或通用的事件来抽象观察(我的意思是观察者方面)机制。能够做到这一点会很感兴趣,例如提供您的应用程序业务层使用的某种框架。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 2010-10-19
相关资源
最近更新 更多