用Guice实现参数化工厂

| 我有一个我想使用Guice重新实现的工厂:
enum MyObjects { OBJECT1, OBJECT2, ... }
class Object1 implements SomeInterface { ... }
class Object2 implements SomeInterface { ... }
...
class Factory {
  public static SomeInterface createObject(MyObjects obj) {
    switch (obj) {
    case OBJECT1: return new Object1();
    case OBJECT2: return new Object2();
    ...
    }
  }
有没有简单的方法来实现它? 诸如Provider.get(parameter)之类的东西,并使用绑定来定义每种情况下应使用哪个对象?     
已邀请:
        您在这里有几种选择。 1.由于您使用ѭ1来区分实现,因此您有一定数量的实现,可以使用各自的绑定定义每个实现,前提是您在注入期间使用了注释
public @interface SomeInterfaceKind {
    MyObjects value();
}
在您的
Module
中:
bind(SomeInterface.class)
    .annotatedWith(new SomeInterfaceKindImpl(MyObjects1.OBJECT1)
    .to(Object1.class);
...
然后在要注入的类中:
@Inject void setSomeInterface(
    @SomeInterfaceKind(MyObjects.OBJECT1) SomeInterface object) {...}
在这里,您必须定义实现
SomeInterfaceKind
SomeInterfaceKindImpl
类(是的,可以扩展注释!)有关更多详细信息,请看一下如何在Guice中实现
Named
。 2.您还可以按以下方式使用Guice MapBinder(我发现它更易于实现) 在您的模块中:
MapBinder.newMapBinder(MyObjects.class, SomeInterface.class)
    .addBinding(MyObjects.OBJECT1).to(Object1.class);
MapBinder.newMapBinder(MyObjects.class, SomeInterface.class)
    .addBinding(MyObjects.OBJECT2).to(Object2.class);
然后在注入方法中:
@Inject void setSomeInterface(Map<MyObjects, SomeInterface> map) {
    SomeInterface object1 = map.get(MyObjects.OBJECT1);
    ...
}
    
        您也可以使用辅助注射
public interface Factory {

    public Object1 createObject1(String param1);
    public Object2 createObject2(Date param2);

}


public class Object1 {
     @AssistedInject
     public Object1(String param1) {
          // do something
     }
}

public class Object2 {
     @AssistedInject
     public Object2(Dateparam2) {
         // do something
     }
}
然后在您的模块中
install(new FactoryModuleBuilder()
     .implement(Object1.class, Object1.class)
     .implement(Object2.class, Object2.class)
     .build(Factory.class));
然后您可以在需要的地方使用工厂
@Inject
private Factory factory;
    

要回复问题请先登录注册