假设我有一个模块,我只想导出A
的实例。但是,此A
要求B
和C
的实例在构造函数中传递。所以我们也会在模块中声明它们:
public class SampleModule {
@Provides
@Singleton
A provideA(B b, C c){
return new A(b, c);
}
@Provides
@Singleton
B provideB(){
return new B();
}
@Provides
@Singleton
C provideC(){
return new C();
}
}
这样做有效,但现在代码中的其他地方也可以使用B
和C
。我希望将它们保密,并强制客户端类只能访问A
。
有没有办法实现这个目标?
答案 0 :(得分:5)
实现该目标的最简单方法是将您不希望提供的类型(在本例中为B
和C
)与@Qualifier
绑定在一起无法访问。
然后,虽然可以从模块外部访问B
和C
,但为了注入它们,您需要提供限定符,而不是。
@Module
public final class SampleModule {
@Qualifier
@Retention(RUNTIME)
private @interface SampleModuleOnly {}
@Provides
@Singleton
static A provideA(@SampleModuleOnly B b, @SampleModuleOnly C c){
return new A(b, c);
}
@Provides
@SampleModuleOnly
@Singleton
static B provideB(){
return new B();
}
@Provides
@SampleModuleOnly
@Singleton
static C provideC(){
return new C();
}
}
答案 1 :(得分:0)
一个简单的方法是
@Retention(BINARY)
@Qualifier
private annotation class InternalApi
@Module
object NetworkModule {
@Provides
@InternalApi
fun provideClient(): OkHttpClient {
//...
}
@Provides
fun provideRetrofit(
@InternalApi client: Lazy<OkHttpClient>
): Retrofit {
//...
}
}
从here中剔除。
基本上,我们创建私有限定符-在这种情况下,@InternalApi
用于限定OkHttpClient
依赖关系,从而使其对我们的模块私有。