Roboguice / getInstance + лучшая практика - PullRequest
1 голос
/ 18 августа 2011

Я только начал использовать Roboguice (+ Guice), и я не уверен в том, как лучше его использовать.

В своей деятельности у меня есть около 5 функций (из примерно 30), которые используют объектназывается «ProviderQueries» (Синглтон).Я мог бы использовать его двумя способами:

1.)

    protected void onResume() {
       super.onResume();
       getInjector().getInstance(ProviderQueries.class).setLanguage("EN");
}

2.)

class MyActivity extends RoboActivity {
    @Inject
    private ProviderQueries pv;

    ...

       protected void onResume() {
          super.onResume();
          pv.setLanguage("EN");
          }        
 }

1 - слишком долго, но экземпляр ProviderQueries используется там, гдеэто необходимо
2 - коротко и красиво, но "pv" доступно для всей Деятельности, но нужно только в 5 различных функциях ...

Какой подход вы бы использовали, или у вас есть лучшее решение?

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

Ответы [ 2 ]

1 голос
/ 18 августа 2011

Это что-то вроде суждения.Мне 5 функций кажется достаточным оправданием, чтобы поместить это в переменную-член, которая использует более чистый синтаксис и уменьшает явную зависимость от инжектора.Я вижу вашу точку зрения о том, что она не используется во всех 30 методах, но, по моему личному мнению, это кажется второстепенной проблемой (ваше собственное чувство эстетики может отличаться).

Если ProviderQueries особенно интенсивно использует памятьвы можете рассмотреть возможность использования варианта 2 вместо 1, так как вариант 1 будет поддерживать объект в течение всего действия.Не учитывает большинство объектов, но может стать проблемой для некоторых.

Если бы вы не использовали Guice, как бы вы получили доступ к вашему синглтону?Предположительно через метод доступа?Конечно, вы всегда можете написать свой собственный аксессор, который # 2 выполняет для вас более компактным способом, хотя он не обойдёт небольшую нагрузку на отражение, возникающую при каждом доступе к синглтону.

0 голосов
/ 21 апреля 2012

Может быть, вам нужно использовать классы провайдера Guice.

Для (упрощенного) примера с сайта Guice:

public class RealBillingService implements BillingService {
  private final Provider<CreditCardProcessor> processorProvider;

  @Inject
  public RealBillingService(Provider<CreditCardProcessor> processorProvider) {
    this.processorProvider = processorProvider;
  }

  public Receipt chargeOrder(PizzaOrder order, CreditCard creditCard) {
    CreditCardProcessor processor = processorProvider.get();

    /* use the processor and transaction log here */
  }
}

Провайдеры скрывают область и легки. Они могут храниться в памяти после начальной инъекции, но не будут содержать ссылку на конкретный объект, который вы используете.

Документирование этого с дополнительными примерами: http://code.google.com/p/google-guice/wiki/InjectingProviders

...