【问题标题】:Define Implementation for abstract Object定义抽象对象的实现
【发布时间】:2009-07-27 12:02:24
【问题描述】:

我正在寻找一种方法来执行以下操作:

一个项目: 定义一个在某些事件发生时调用的抽象类(如果您愿意,可以使用事件处理程序) 使用上面的事件处理程序定义将触发事件的引擎

B 项目: 定义抽象类的实现 运行引擎。

我如何注册实现类并确保它是引擎运行时被调用的类。

编辑 1:我的意思是我必须以某种方式定义应该为给定抽象对象调用的实现

对不起,如果问题不太清楚,如果您需要更多详细信息,请告诉我

【问题讨论】:

  • 注册实现类是什么意思?
  • 据我了解(也许您可以提供更多说明,例如伪代码),您必须将实际的 B 项目实现实例化为对 A 项目抽象类的引用。

标签: java class dependency-injection abstraction


【解决方案1】:

这样的?

class A implements EventHandlerForB {
...
}

public class B {
  private EventHandlerForB eventHandler;

  public void registerEventHandler(EventHandlerForB eventHandler) {
    this.eventHandler = eventHandler;
  }
...
}

public interface EventHandlerForB {
...
}

【讨论】:

  • 传递它认为构造函数可能更适合单播。
  • 这个解决方案确实需要我编写调用处理程序的类,我没有这样做。使用您的对象,在我的问题中,B 类将被关闭,而 A 类将是我实现的。
【解决方案2】:

在运行时,您可以在 A 项目中传递实现的名称(带有属性文件或 Java 系统属性)。 然后在类路径中使用class.forName() 找到这个类,并使用newInstance() 对其进行实例化。

但您更喜欢使用像 Guice 或 Spring 这样的框架,它可以让您以干净的方式将东西粘合在一起。

【讨论】:

  • 我实施的解决方案是基于您的第一个建议,我看了一下 Guice,可能最终会选择它,但现在这已经足够了,谢谢
【解决方案3】:

有几种“模式”试图解决这个问题。仅使用 JDK(6 或以上)类你可能想看看 java.util.ServiceLoader

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    相关资源
    最近更新 更多