【问题标题】:CDI - Event ObserversCDI - 事件观察者
【发布时间】:2010-08-29 18:53:59
【问题描述】:

我有事件观察器,它们都观察相同的事件,所以我有一个抽象超类来观察该事件,然后子类覆盖/实现特定功能。

这样做的问题是它不会观察事件,除非我将事件观察器方法放在子类中(这违背了我的设计目的)。

我当然可以这样做,但我想编写尽可能少的代码。

应该这样工作吗(我做错了什么)?

如果它不应该以这种方式工作,那么我可以为一件事编写一个生产者,然后编写一个拦截器。我认为我的第一种方法更简单,更容易被其他开发人员正确使用。

示例代码:

超类:

public abstract class AbstractFileWriter
{
  public void onReady(@Observes ReadyEvent readyEvent)
  {
    try
    {
      handleReady(readyEvent, ...);
    }
  }

  protected abstract handleReady(ReadyEvent readyEvent, otherParameters go here);
}

子类

public class XmlWriter extends AbstractFileWriter
{
   protected handleReady( ... )
   { ... }
}

如果我这样写,handleReady 永远不会被调用(而且 onReady 也不会被调用);但是,如果我使用子类中的观察者方法编写它,它会按预期工作。我想以这种方式编写它,因为我必须编写的代码少得多,抽象的少一点应该更容易理解。

沃尔特

【问题讨论】:

  • 你是说JVM调用的是超类的方法而不是子类的覆盖方法?

标签: java java-ee-6 cdi


【解决方案1】:

要么将超类中的相关方法声明为抽象,要么让它调用每个子类实现的抽象“详细”方法。

【讨论】:

  • 这就是我所做的,我更新了我的问题以包含我的代码的非常粗略的大纲。它完全按照你说的做。问题在于超类中的具体实现永远不会被容器调用(Glassfish 3.1 嵌入)。
  • 你所描述的不应该发生。听起来像是 Glassfish 的问题。
【解决方案2】:

如上所述,我写了一个装饰器。这基本上做同样的事情,只是写法略有不同。

沃尔特

【讨论】:

  • 你是如何绕过 WELD-001446:装饰器不能有观察者方法的?
猜你喜欢
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 2015-06-11
相关资源
最近更新 更多