Оптимизация реестра с помощью Guice - PullRequest
3 голосов
/ 14 сентября 2011
  • Привет!Сегодня я подумал о некоторой оптимизации и у меня возникли вопросы ...

Контекст: я занимаюсь разработкой на Java с использованием Guice 2.


В моемвеб-приложение, у меня есть реестр конвертер для преобразования на лету в определенный тип.Конвертер описывается следующим образом:

public class StringToBoolean implements Converter<String, Boolean>
{

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

}

Мой реестр - это не что иное, как Карта:

public class ConverterRegistryImpl implements ConverterRegistry
{  

  private Map<Key,Converter<?,?>> converterRegistry = new HashMap<Key, Converter<?,?>>();

  @Override
  public <F, T> void register(Class<F> fromType, Class<T> toType, Converter<F, T> converter) 
  {
      converterRegistry.put(new Key(fromType,toType), converter);
  }

}

Наконец я регистрирую свой конвертер в своем реестре (класс: ServletModule: configureServlets ())
Я думаю, этот шаг можно оптимизировать ...

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;

  • Что ж, я ищу лучший способ реализовать это с помощью Guice.
  • В общем, как вы создавали такого рода реестр с Guice (или без)?

Заранее спасибо!

1 Ответ

2 голосов
/ 14 сентября 2011

Не знаю, что именно вы подразумеваете под «оптимизировать».Одним из недостатков вашего подхода является то, что вы создаете свои конвертеры и реестр вручную, поэтому вы не используете для них преимущества внедрения зависимостей.Также вы не можете накапливать конвертеры из разных модулей.

Это может быть исправлено с расширением для нескольких связей: http://code.google.com/p/google-guice/wiki/Multibindings

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

Полный код доступен по адресу: https://gist.github.com/1217563

...