我的代码如下:
class A {
X x;
A() {
Class<? extends X> cls = ...;
Module module = ...;
Injector injector = Guice.createInjector(module);
x = injector.getInstance(cls);
}
}
具体类型cls
仅在运行时确定,并且在调用此构造函数之前未知。
我现在的问题是cls
的构造函数应该抛出已检查的异常,并且我想处理它们(如果可能的话,不用将它们从ProvisionException中解包)。 Guice文档说我应该使用投掷提供者扩展,这似乎很复杂。有没有比这更简单的方法:
interface MyCheckedProvider<T> extends CheckedProvider<T> {
T get() throws MyCheckedException;
}
class XImplProvider implements MyCheckedProvider<X> {
@Inject dependency1;
@Inject dependency1;
X get() throws MyCheckedException {
return new XImpl(dependency1, dependency2);
}
}
class ProviderHolder {
@Inject MyCheckedProvider<X> provider;
}
class A {
X x;
A() {
Class<? extends MyCheckedProvider<X>> providerClass = ...;
Module module = new AbstractModule() {
void configure() {
...
ThrowingProviderBinder.create(binder())
.bind(MyCheckedProvider.class, X.class)
.to(providerClass.class);
}
};
Injector injector = Guice.createInjector(module);
ProviderHolder holder = injector.getInstance(ProviderHolder.class);
try {
x = holder.provider.get();
catch (MyCheckedException e) {
...
}
}
}
接口MyCheckedProvider
没关系,因为它可以在几个地方重用,但我需要在每个需要类似的地方单独的ProviderHolder
类,我需要一个特定的实现X的每个类的提供者实现(其中可能有很多)。所以这比仅注入一个XFactory并为每个具体类型编写一个XFactoryImpl(我试图避免)更多的工作。
我曾希望我能做点像
injector.getInstance(new TypeLiteral<MyCheckedProvider<X>>() {});
或
injector.getCheckedProvider(cls, MyCheckedException.class);
但似乎不支持。
答案 0 :(得分:1)
您想在此使用Key
课程,而不是TypeLiteral
。那么就不需要ProviderHolder
:
Injector injector = Guice.createInjector(module);
MyCheckedProvider<X> provider = injector.getInstance(new Key<MyCheckedProvider<X>>(){});
try {...