我刚刚开始使用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种不同的功能......
您会使用哪种方法,或者您有更好的解决方案?
提前致谢!
答案 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