#java #guice
#java #guice
Вопрос:
class TestClass {
@Inject
public TestClass(String arg1, @Assisted String arg2) {
System.out.printf("TestClass(%s, %s)n", arg1, arg2);
}
}
interface TestFactory {
TestClass makeTestClass(String extraArg);
}
class Main {
@Inject
public TestFactory factory;
public static void main(String[] args) {
Injector i = Guice.createInjector(
new AbstractModule() { @Override protected void configure() {
bind(String.class).toInstance("any string");
install(new FactoryModuleBuilder().build(TestFactory.class));
}}
);
Main m = i.getInstance(Main.class);
m.factory.makeTestClass("assisted");
}
}
Этот код работает корректно и выводит «TestClass(любая строка, с поддержкой)».
Но по документу я должен вызвать что-то вроде
install(new FactoryModuleBuilder()
.implement(TestClassInterface.class, TestClass.class)
.build(TestFactory.class));
Когда и почему я действительно должен использовать implementate()? Только когда выполняются именованные привязки?
Ответ №1:
Вам нужно использовать, .implement()
когда возвращаемый тип вашего фабричного метода отличается от того типа, который вы хотите, чтобы Guice создал экземпляр. Обычно это происходит, если ваш фабричный метод возвращает тип интерфейса. Вы используете .implement()
, чтобы указать Guice конкретный тип класса, который он должен создавать.
Комментарии:
1. ах, ясно, это просто дополнительная необязательная привязка().to() и не обязательна