Я собираюсь предположить, что 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();
}
}