0

我有多个使用辅助注入从客户端工厂提取的演示者小部件。

public interface FieldFactory {

    TextboxPresenterWidget createTextBoxWidget(Field field);
    BooleanPresenterWidget createBooleanWidget(Field field);
        ...
}

这目前工作正常,但我想要做的是能够创建我想要的小部件,而不必专门调用它,而是能够将它的类型作为注入的一部分传入以获取正确的 PresenterWidget。

每个“字段”对象都有一个枚举属性,它是什么类型的......我想知道是否有办法,我将如何去做。

最好我的工厂看起来更像这样:

public interface FieldFactory {

    TextboxPresenterWidget create(Field field, FieldType type);
    BooleanPresenterWidget create(Field field, FieldType type);
        ...
}

这将使我的 impl 代码更像:

...
for(Field field : fields) {
    addToSlot(SLOT_NAME, fieldFactory.create(field, field.getType()));
}
...

感谢您的任何意见,非常感谢!

4

1 回答 1

0

无论如何,switch…case枚举值都必须在某个地方完成,虽然我可以理解您更愿意为您生成它而不是手动编码,但 GIN 不会这样做,它可能需要更多(或至少与开关代码本身一样多)配置代码。

那么,一个遵循辅助注射的手写工厂怎么样?

public class FieldFactory {
  @Inject AssistedFieldFactory factory;

  public PresenterWidget create(Field field) {
    switch (field.getType()) {
    case TEXTBOX:
      return factory.createTextBoxWidget(field);
    case BOOLEAN:
      return factory.createBooleanWidget(field);
    default:
      throw new IllegalArgumentException();
    }
  }
}
于 2013-06-18T09:23:08.967 回答