Roboguice / getInstance +最佳实践

时间:2011-08-18 07:52:45

标签: android guice roboguice

我刚刚开始使用Roboguice(+ Guice),我不确定如何使用它的最佳做法。

在我的Activity中,我有大约5个函数(大约30个),它们使用一个名为“ProviderQueries”(Singleton)的对象。我可以用两种方式使用它:

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 个答案:

答案 0 :(得分:1)

这是一个判断电话。对我来说,5个函数似乎足以将其置于成员变量中,该变量使用更清晰的语法并减少对注入器的显式依赖性。我认为你的观点并没有在所有30种方法中使用,但这在我个人看来似乎是次要问题(你自己的美学感当然可能不同)。

如果ProviderQueries特别是内存密集型,您可能需要考虑使用选项2而不是1,因为选项1将使对象在活动期间保持活动状态。不是大多数对象的考虑因素,但对某些人来说可能是一个问题。

如果你没有使用Guice,你会如何访问你的单身人士?想必通过一种存取方法?当然,您可以编写自己的访问器,以更紧凑的方式为您执行#2,尽管它不会绕过每次访问单例时产生的小反射开销。

答案 1 :(得分:0)

也许你需要使用Guice的Provider类。

来自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