Проблема МОК со много привязкой

Я - новичок Java и МОК также. Как сделать материал:


public class Foo{

    //private Bar bar; //Bar is an interface private int var; public Foo(){ } public void setVar(int var){
      this.var = var;
    } public Bar getBar(){
      if(var==1){
        return new BarImpl1(); //an implemantation of Bar interface
      }
      else if(var==2){
        return new BarImpl2(); //an implemantation of Bar interface
      }
      else{
        return new BarImpl(); //an implemantation of Bar interface
      }
    }
}

в МОК путь на примере Guice?


public class Foo{

    private Bar bar; //Bar is an interface private int var; @Inject public Foo(Bar bar){
      this.bar = bar;
    } public void setVar(int var){
      this.var = var;
    } public Bar getBar(){
      return bar; // or what else??
    }
}

Как я должен настроить свой инжектор?


@Override 
protected void configure() {
    bind(Bar.class).to(BarImpl.class);
    //and what else??
}
7
задан alexandrul 19 May 2010 в 09:07
поделиться

1 ответ

Я собираюсь предположить, что var - это код, который определяется во время выполнения на основе данных, пользовательского ввода и т. Д., И единственный экземпляр Foo должен иметь возможность возвращать различные реализации Bar в зависимости от этого кода (это динамическая фабрика Bar ).

В этом случае вы, вероятно, захотите использовать MapBinder из расширения Multibinding.

Вы, вероятно, сделали бы что-то вроде этого:

MapBinder<Integer, Bar> mapbinder
     = MapBinder.newMapBinder(binder(), Integer.class, Bar.class);
mapbinder.addBinding(1).to(BarImpl1.class);
mapbinder.addBinding(2).to(BarImpl2.class);

bind(Bar.class).to(BarImpl.class); // the fallback

Тогда Foo мог бы выглядеть так:

public class Foo {
   private final Provider<Bar> defaultProvider;
   private final Map<Integer, Provider<Bar>> barTypeMap;

   private int var = -1;

   @Inject public Foo(Provider<Bar> defaultProvider, 
                      Map<Integer, Provider<Bar>> barTypeMap) {
     this.defaultProvider = defaultProvider;
     this.barTypeMap = barTypeMap;
   }

   public void setVar(int var) { ... }

   public Bar getBar() {
     if(barTypeMap.containsKey(var)) {
       return barTypeMap.get(var).get();
     }

     return defaultProvider.get();
   }
}
4
ответ дан 7 December 2019 в 14:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: