Я "працюю над реалізацією DI, конкретно введення конструктора за допомогою доказів". У мене виникають труднощі з розумінням того, як я можу ввести тип класу для загального в конструктор.
Мій клас такий:
public class Foo<T> {
private Class<T> clazz;
Foo(Class<T> clazz) {
this.clazz = clazz;
}
}
Чи можу я використовувати guice для введення типу класу в конструктор під час виконання? Простіше кажучи, чи можу я використовувати настрій для введення в конструктор Foo?
Відповіді:
1 для відповіді № 1Так, ви можете зробити це за допомогою Guice "s вбудована ін'єкція від TypeLiteral
с
public class Main {
public static void main(String[] args) {
Injector injector = Guice.createInjector();
Test<Integer> testInt = injector.getInstance(Key.get(new TypeLiteral<Test<Integer>>() {}));
testInt.action();
Test<String> testString = injector.getInstance(Key.get(new TypeLiteral<Test<String>>() {}));
testString.action();
}
public static class Test<T> {
private final Class<? super T> clazz;
@Inject
public Test(TypeLiteral<T> literal) {
this.clazz = literal.getRawType();
}
public void action() {
System.out.println(clazz);
}
}
}
Я не дуже впевнений, чому getRawType()
повертає Class<? super T>
, ні Class<T>
, правда.
0 для відповіді № 2
використовувати
bind(new TypeLiteral<Class<SomeClass>>() {}).toInstance(SomeClass.class);
налаштувати Guice для введення SomeCLass.class
в конструктор
Foo<SomeClass>