作者:cmm雨轩 | 来源:互联网 | 2022-12-03 13:54
我不确定Dagger2的@Bind注释的用途。
根据我在网上阅读的内容,即时通讯仍然不清楚,但这是一个示例:
@Module
public abstract class HomeModule {
@Binds
public abstract HomePresenter bindHomePresenter(HomePresenterImp
homePresenterImp);
}
并且类定义如下所示:
public interface HomePresenter {
Observable> loadUsers();
}
public class HomePresenterImp implements HomePresenter {
public HomePresenterImp(){
}
@Override
public Observable> loadUsers(){
//Return user list observable
}
}
如果我只能使用提供注释,为什么还要使用@Binds,如下所示:
@Provides
public HomePresenter provideHomePresenter() {
return new HomePresenterImp();
}
@Binds而不是@Provides的用例是什么?如果我使用@Binds,我是否仍需要在我的appcomponent中声明它(当我使用@Binds时,它是一个抽象类)?
1> Jeff Bowman ..:
@Binds可以完全等同于@Provides注释的方法,如下所示:
@Provides
public HomePresenter provideHomePresenter() {
return new HomePresenterImp();
}
...尽管您可能更喜欢使用HomePresenterImp作为方法参数的变量,该变量允许Dagger实例化HomePresenterImp(假设它具有@Inject构造函数),包括传递所需的任何依赖项。您也可以这样做static
,因此Dagger不需要实例化Module实例即可调用它。
@Provides
public static HomePresenter provideHomePresenter(HomePresenterImp presenter) {
return presenter;
}
那为什么要选择@Binds
呢?Dagger对此有一个常见问题解答,但归结为以下原因:
@Binds(略)更紧凑:您可以跳过实现。
@Binds在接口和抽象类中工作,而Dagger功能(例如@BindsOptionalOf和@ContributesAndroidInjector)则严格要求使用@Binds。
@Binds帮助您的代码保持高效。@Provides方法可以是实例方法,需要Dagger实例化您的Module才能调用它们。设置@Provides方法static
也可以完成此操作,但是如果您忘记了@Provides方法,仍然可以编译static
。@Binds方法不会。
@Binds防止Dagger进行代码生成并为该对象保留单独的Factory / Provider,因为Java不允许Dagger访问其实现是多么简单。在您的情况下,Dagger可以将Provider
a Provider
强制转换为a,并且仅保留一个,而不是为HomePresenter保留一个,而只为HomePresenterImp调用一个。
因此,整个事情可以很好地表示为:
@Binds abstract HomePresenter bindHomePresenter(HomePresenterImp presenter);