【问题标题】:How to create instance of a class which is created using guice factory assisted inject and is extended from an abstract class?如何创建使用 guice 工厂辅助注入创建并从抽象类扩展的类的实例?
【发布时间】:2016-07-15 10:24:12
【问题描述】:

我有以下层次结构:

~interface Car

  ~ abstract class SportsCar

     ~ class Ferrari

我使用 FerrariFactory 创建了一个 Ferrari 类的实例(模块中的代码如下所示):

install(new FactoryModuleBuilder().build(FerrariFactory.class));

FerrariFactory 接口有以下方法,我使用辅助注射来注射零件(这是包含所有零件的 xml 元素,即法拉利特定零件 + 跑车零件):

Ferrari create(@Assisted Element partsElement);

当我创建一个 Ferrari 实例时,我正在使用以下内容:

ferrariFactory.create(partsElement);

首先调用 Ferrari 构造函数:

   @Inject
public Ferrari(Element parts) {
    super(parts);
    this.ferrariRadio= getElementValue(parts, "Parts/FerrariParts/ferrariRadio");
}

因为第一行是对 SportsCar 的超类构造函数的调用:

        public SportsCar (Element parts) {
        super();
        System.out.println("SportsCarconstructor: 1");
        System.out.println("SportsCarconstructor: 2 "+parts);
...
... // where I set the basic parts from the parts xml element
}

由于 SportsCar 是抽象的,我在 guice 模块中没有绑定。我不确定如何绑定它。此外,即使我没有通过 null 访问任何内容(空指针的奇怪情况),我在 SportsCar 构造函数的第二个 sysout 行也得到了 NullPointerException。

关于它是否是绑定问题或为什么我的抽象类构造函数无法设置部分的任何建议?

【问题讨论】:

    标签: java guice


    【解决方案1】:

    好的。找到了答案。我错过了两件事:

    1.错过了 Ferrari 构造函数中的 @Assisted 注解:

        @Inject
        public Ferrari(@Assisted Element parts) {
         super(parts);
    ....
        }
    

    2。我可以在模块中声明抽象类和实现如下:

    install(new FactoryModuleBuilder().implement(SportsCar.class,Ferrari.class).build(FerrariFactory.class));
    

    【讨论】:

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