我在 Dagger 2 示例中看到一些人在模块的供应方法和提供的类上使用 @Singleton
。
@Provides
@Singleton
Navigator providesNavigator(ActivityNavigator activityNavigator) {
return activityNavigator;
}
对比
@Singleton
public class ActivityNavigator extends Navigator {}
这两个展示位置有什么区别?应该两者都用还是其中一个就够了?
最佳答案
@Singleton
public class ActivityNavigator extends Navigator {}
将与构造函数注入(inject)一起使用,也就是说,如果 dagger 为您创建对象。
这就是说,如果你有上面的注解和使用构造函数注入(inject),就像下面...
@Provides
@Singleton
Navigator providesNavigator(ActivityNavigator activityNavigator) {
return activityNavigator;
}
Dagger 将在组件中创建(并保留)ActivityNavigator
实例作为 @Singleton
。然后它将为您提供这个单例实例,您将它作为 Navigator
返回,也是一个单例。无论您在何处使用此组件,如果您需要 ActivityNavigator
或 Navigator
将被使用。
在您的情况下,这是多余的。如果您计划使用 Navigator
接口(interface),而不是实现,则不需要或将再次创建相同的对象。保留它可能仍然是一个安全的选择,因为在应用程序的不同部分不使用相同的“单例”通常是可以通过这种方式避免的错误。
注释将如下所示:
@Singleton
public class ActivityNavigator extends Navigator implements SomeThingElse {}
不管是什么原因,现在您有一个对象可能提供 2 种不同的实现。如果您想始终重复使用同一个对象,则必须确保它只被创建一次。如果您不为构造函数注入(inject)提供注解,该对象将被创建两次。但既然你这么做了,Navigator
和 SomeThingElse
都会返回同一个对象。
@Provides
@Singleton
Navigator providesNavigator(ActivityNavigator activityNavigator) {
return activityNavigator; // singleton ActivityNavigator!
}
@Provides
@Singleton
SomeThingElse providesSomethingElse(ActivityNavigator activityNavigator) {
return activityNavigator; // the same ActivityNavigator!
}
关于java - "provides"方法或注入(inject)类上的 Dagger 2 范围注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38392014/