Android 在Dagger2中,@Singleton注释的目的是什么?
假设我们有一个classAndroid 在Dagger2中,@Singleton注释的目的是什么?,android,singleton,dagger-2,Android,Singleton,Dagger 2,假设我们有一个class计数器: public class Counter { private int count; public Counter() { count = 0; } public int getCount() { return count; } public void count() { count++; } } 以及提供计数器的ApplicationModule: @
计数器
:
public class Counter {
private int count;
public Counter() {
count = 0;
}
public int getCount() {
return count;
}
public void count() {
count++;
}
}
以及提供计数器的ApplicationModule
:
@Module
public class ApplicationModule {
private Context context;
private Counter counter;
public ApplicationModule(Context context) {
this.context = context;
counter = new Counter();
}
@Provides @Singleton
public Counter provideCounter() {
return counter;
}
}
通过将@Singleton
注释添加到providedCounter()
方法,是否指定只提供一个计数器对象
如果我们提供两个计数器对象:
@Module
public class ApplicationModule {
private Context context;
private Counter numberOfTimesButtonAWasPressed;
private Counter numberOfTimesButtonBWasPressed;
public ApplicationModule(Context context) {
this.context = context;
numberOfTimesButtonAWasPressed = new Counter();
numberOfTimesButtonBWasPressed = new Counter();
}
@Provides @Named("buttonACounter")
public Counter provideButtonACounter() {
return numberOfTimesButtonAWasPressed;
}
@Provides @Named("buttonBCounter")
public Counter provideButtonBCounter() {
return numberOfTimesButtonBWasPressed;
}
}
@Singleton
注释是否非法?@Singleton
将确保组件中只有一个此类注释
因此,是的,将其设置为singleton将导致在使用该组件的任何地方使用相同的对象。如果创建第二个组件,也将创建第二个计数器,因为它是另一个对象图
@Provides @Named("buttonBCounter")
public Counter provideButtonBCounter() {
return numberOfTimesButtonBWasPressed;
}
也就是说,当我需要名为按钮计数器的计数器时,调用此方法,但始终会返回相同的objct,因为您的模块构造函数:
// don't do this.
public ApplicationModule(Context context) {
numberOfTimesButtonAWasPressed = new Counter();
numberOfTimesButtonBWasPressed = new Counter();
}
尽管您没有使用@Singleton
对其进行注释,但此方法的行为将与以前一样,因为您将对象保留在模块中,并在每次调用时返回相同的实例
// do it right
@Singleton @Provides @Named("buttonBCounter")
public Counter provideButtonBCounter() {
return new Counter();
}
这将与上面的代码具有相同的效果,尽管该方法只被调用一次,然后dagger将处理适当的对象缓存
使用dagger,让dagger处理对象创建可能是个好主意
你甚至可以继续做一些事情,比如
// if you have an @Inject annotated constructor
@Singleton @Provides @Named("buttonBCounter")
public Counter provideButtonBCounter(Counter counter) {
return counter;
}
…这将让您充分利用构造函数注入。如果参数发生更改,则无需更新参数
如果有疑问,只需添加日志语句和/或附加调试器即可。它没有什么魔力,去试试吧 非常感谢你!这澄清了一切!