Java 基于Guice的注册表优化 嗨! 今天我想到了一种优化,有一些问题

Java 基于Guice的注册表优化 嗨! 今天我想到了一种优化,有一些问题,java,registry,guice,Java,Registry,Guice,背景: 我正在使用guice2进行Java开发 在我的web应用程序中,我有一个转换器注册表,可以动态转换为特定类型。转换器描述如下: public class StringToBoolean implements Converter<String, Boolean> { @Override public Boolean convert(String from) { return Boolean.valueOf(from); } } 这样,我可

背景: 我正在使用guice2进行Java开发


在我的web应用程序中,我有一个转换器注册表,可以动态转换为特定类型。转换器描述如下:

public class StringToBoolean implements Converter<String, Boolean>
{

  @Override
  public Boolean convert(String from) 
  {
      return Boolean.valueOf(from);
  }

}

这样,我可以像这样在任何地方使用它:

@Inject 
ConverterRegistry converter;

  • 我正在寻找使用Guice实现此功能的最佳方法
  • 更一般地说,您是如何使用Guice(或不使用Guice)构建这种注册表的

提前谢谢

我不知道“优化”到底是什么意思。这种方法的一个缺点是手工创建转换器和注册表,所以不使用依赖注入的优点。此外,您不能累积来自不同模块的转换器

这可以通过guice的多绑定扩展来解决:

Injector-Injector=Guice.createInjector(新模块(){
@凌驾
公用作废配置(活页夹){
@抑制警告(“原始类型”)
Multibinder converterBinder=Multibinder.newSetBinder(binder,Converter.class);
converterBinder.addBinding().to(StringBooleanConverter.class);
converterBinder.addBinding().to(BooleanStringConverter.class);
}
});
ConverterRegistryImpl registry=injector.getInstance(ConverterRegistryImpl.class);

完整代码可在以下位置获得:

Hm,没有Guice的1.2版……是的,我犯了一个错误。我使用版本2 thanksOk来检索特定的转换器。我必须检查每个转换器是否可以转换2种类型(从类型到类型)??不。正如您可能看到的,我在setter中使用了您的方法:void register(Class fromType,Class toType,Converter Converter)哦,好的!我们必须维护地图,还是最好检查每个转换器!这是一个很好的解决方案-我将更新我的项目。非常感谢。取决于您将拥有的转换器数量。Map的伸缩性更好,但我看不到用它删除getFirstClass()和getSecondClass()的样板代码的方法。MapBinder呢:MapBinder.addBinding(Key(String.class,Integer.class)).to(StringToInteger.class);>可能吗?
ConverterRegistryImpl registry = new ConverterRegistryImpl();
registry.register(String.class, Integer.class, new StringToInteger());
registry.register(String.class, Boolean.class, new StringToBoolean());
...
//Then I bind the registry to this current instance...
bind(ConverterRegistry.class).toInstance(registry)
@Inject 
ConverterRegistry converter;
    Injector injector = Guice.createInjector(new Module() {
        @Override
        public void configure(Binder binder) {
            @SuppressWarnings("rawtypes")
            Multibinder<Converter> converterBinder = Multibinder.newSetBinder(binder, Converter.class);
            converterBinder.addBinding().to(StringBooleanConverter.class);
            converterBinder.addBinding().to(BooleanStringConverter.class);
        }
    });
    ConverterRegistryImpl registry = injector.getInstance(ConverterRegistryImpl.class);