我最近阅读了有关Google Guice中@ImplementedBy
可用的注释的信息。它允许程序员指定接口与其实现之间的绑定,以供将来在依赖关系注入中使用。这是即时绑定的示例。
我已经习惯于使用以下语法在模块中定义显式绑定:
bind(SomeInterface.class).to(SomeInterfaceImplementation.class);
根据文档,这等效于@ImplementedBy
注释的以下用法:
@ImplementedBy(SomeInterfaceImplementation.class)
public interface SomeInterface {
//method declarations
}
我在这里看到的唯一好处是代码短了一点。同时,这种方法也有一个缺点,由相同的文档正确指出:
@ImplementedBy
小心使用;它从接口到其实现添加了编译时依赖性。
在许多情况下,这种依赖关系可能不是问题,但我个人认为这是代码的味道。
什么用例使@ImplementedBy
注释值得使用?
一种可能的方法似乎是在库或框架的代码中使用它。如文档中所述,注释可以提供默认绑定,很容易被显式绑定覆盖。
如果一个类型同时在一个
bind()
语句(作为第一个参数)中并且具有@ImplementedBy
注释,bind()
则使用该语句。批注建议可使用绑定覆盖的默认实现。
这样,作为库的开发人员,我可以为用户提供现成的绑定,可以在客户端代码中的某个位置进行自定义。
这是注释存在的唯一原因吗?还是我想念的东西?我可以通过在只使用某些业务逻辑的应用程序而不是要扩展的库/框架的代码中使用它来获得任何收益吗?