【发布时间】:2017-12-10 18:21:14
【问题描述】:
我正在尝试了解 Dagger 的 @Reusable 范围的使用。从文档中我可以理解的是,如果提供者的范围是 @Singleton 或任何其他自定义范围,那么将首先创建对象,然后在组件的整个生命周期内缓存该对象。因此,对于并不总是需要是同一个实例或不经常使用的对象,这种方法最终会浪费内存。
但是,如果我们选择一个非作用域的提供者,每次它都会创建一个新实例,而且由于对象实例化成本很高,尤其是在 Android 等环境中,分配可能很昂贵,这可能会导致性能问题。
@Reusable 作用域介于无作用域和作用域实例之间。
来自文档
有时您希望限制实例化 @Inject 构造的类或调用 @Provides 方法的次数,但您不需要保证在任何特定组件的生命周期内使用完全相同的实例或子组件
它是如何工作的?假设我的AppComponent 中有一个可重用的提供程序,它不会总是给我相同的实例吗?
如果我在任何Subcomponent 中注入相同的依赖项,我会得到相同的实例吗?缓存的对象何时会被释放以进行 GC?
我尝试了一个示例,在我的 AppComponent 模块中创建了一个 @Reusable 对象,并从我的子组件中注入了它。
我可以看到它的行为与@Singleton 完全一样。
我们可以通过@Reusable 实现哪些性能改进?
我们应该更喜欢@Reusable 的哪些可能用例?
将 Util 类、Gson、Glide 等所有无状态对象(无论我们是否获得相同的实例)设置为@Reusable 的范围是个好主意吗?
【问题讨论】:
-
将此标记为 Dagger @Reusable scope vs @Singleton 的副本:我认为它回答了您的大部分子问题,但可能无法全部回答。如果您愿意保留这个问题,请告诉我,但我认为将问题/答案结合起来是有意义的。