Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在Dagger2中,@Singleton注释的目的是什么?_Android_Singleton_Dagger 2 - Fatal编程技术网

Android 在Dagger2中,@Singleton注释的目的是什么?

Android 在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: @

假设我们有一个class
计数器

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;
}
…这将让您充分利用构造函数注入。如果参数发生更改,则无需更新参数


如果有疑问,只需添加日志语句和/或附加调试器即可。它没有什么魔力,去试试吧

非常感谢你!这澄清了一切!