我继承了一个使用Dagger 2的Java Web服务项目。基于我迄今为止对Dagger的有限理解,我很困惑为什么注入的每个类在dagger模块类中都有单例注释。如果我在没有匕首的情况下创建这个应用程序,他们就不会都是单身人士,这是匕首特有的东西还是以前的开发人员只是误用了Dagger?
答案 0 :(得分:4)
[...]注入的每个类都有单例注释[...]这是匕首特有的东西吗?
不。默认情况下,@Singleton
是Dagger中唯一包含的范围,但您也可以创建自定义范围,使用@Reusable
可以创建多个对象,但如果可能,将重复使用它们,或者根本不使用范围。
还是以前的开发人员只是误用了Dagger?
如果可能的话,你应该问他们。如果每个对象都是一个Singleton,看起来他们没有在设置中投入大量精力,只是复制粘贴的声明,至少这是我的假设。
答案 1 :(得分:1)
从the user guide中的Reusable
部分开始:
有时您希望限制@Inject构造的次数 class被实例化或调用@Provides方法,但你没有 需要保证在期间使用完全相同的实例 任何特定组件或子组件的生命周期。这可以 在Android等环境中很有用,可以在其中进行分配 昂贵。
两个主要区别:
@Singleton
带注释的类可以保证始终提供相同的实例。如果我们保持全球状态,就需要它。 @Reusable
不提供任何保证。@Singleton
带注释的类的实例,则执行double checking(这很慢)。如果是@Reusable
,则不是我将@Reusable
范围用于构建成本较高的类(例如我用于Retrofit
实例 - 但说实话我从未做过性能测试是否值得使用此注释。
另一方面,我使用@Singleton
注释类作为缓存。
另外,如果你的类保持封装的全局状态:
class StateWrapper {
final State state;
@Inject
StateWrapper(State state) {
this.state = state;
}
}
我的意思是状态事实上保存在State
类中,不要将StateWrapper
注释为@Singleton
,始终注释最小的部分:在此case State
类。
(此提示取自video)