现在,没有办法拥有一个可以自由覆盖的“默认绑定”,而无需使用“overrides”属性(该属性更多地用于测试。)我们正在考虑如何进行默认绑定。
您可能会考虑使用 set 绑定来执行此操作,方法如下:
@Module(...)
class MyModule {
@Qualifier @interface OverridableFoo { }
@Provides(type=SET_VALUES) @OverridableFoo Set<Foo> provideOverriddenFoo() {
return new HashSet<Foo>(); // Empty set to ensure the Set is initialized.
}
@Provides Foo provideFoo(@OverridableFoo Set<Foo> Foo overriddenFoo) {
switch (overriddenFoo.size()) {
case 0: return new DefaultFooImpl();
case 1: return overriddenFoo.iterator().next();
default: throw new IllegalStateException("More than one overridden Foo Provided.");
}
}
}
然后,当您想要覆盖时,您只需包含以下内容:
@Module(...)
class MyModule {
@Provides(type=SET_VALUE) @OverridableFoo Foo provideBetterFoo() {
return new MyAwesomeFoo();
}
}
这不是一个好方法,因为它将应该是编译时错误转移到运行时,但作为我们尝试决定如何处理默认绑定时的权宜之计,我认为它是可行的。