如何使用Guice很好地处理构造函数中的已检查异常?

时间:2011-09-14 06:25:17

标签: java guice

我的代码如下:

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);

但似乎不支持。

1 个答案:

答案 0 :(得分:1)

您想在此使用Key课程,而不是TypeLiteral。那么就不需要ProviderHolder

Injector injector = Guice.createInjector(module);
MyCheckedProvider<X> provider = injector.getInstance(new Key<MyCheckedProvider<X>>(){});
try {...