Li recentemente sobre a @ImplementedBy
anotação disponível no Google Guice . Ele permite que o programador especifique uma ligação entre uma interface e sua implementação para uso futuro em injeção de dependência. É um exemplo de ligação just-in-time .
Estou bastante acostumado a definir ligações explícitas nos meus módulos, usando a seguinte sintaxe:
bind(SomeInterface.class).to(SomeInterfaceImplementation.class);
De acordo com a documentação, isso é equivalente ao seguinte uso da @ImplementedBy
anotação:
@ImplementedBy(SomeInterfaceImplementation.class)
public interface SomeInterface {
//method declarations
}
O único ganho que posso ver aqui é que o código é marginalmente mais curto. Ao mesmo tempo, essa abordagem tem uma desvantagem apontada corretamente pelos mesmos documentos:
Use com
@ImplementedBy
cuidado; ele adiciona uma dependência em tempo de compilação da interface para sua implementação.
Essa dependência pode não ser um problema em muitos casos, mas eu pessoalmente a vejo como um cheiro de código.
Quais casos de uso @ImplementedBy
valem a pena usar a anotação?
Uma maneira possível parece ser empregá-la no código de uma biblioteca ou estrutura. Conforme descrito nos documentos, a anotação pode fornecer uma ligação padrão facilmente substituída por uma explícita.
Se um tipo estiver em uma
bind()
instrução (como o primeiro argumento) e tiver a@ImplementedBy
anotação, abind()
instrução será usada. A anotação sugere uma implementação padrão que pode ser substituída por uma ligação.
Dessa forma, como desenvolvedor de uma biblioteca, posso fornecer aos meus usuários uma ligação pronta para uso que pode ser personalizada em algum lugar no código do cliente.
Essa é a única razão para a anotação existir? Ou há algo que estou perdendo? Posso ganhar alguma coisa usando-o em código que é apenas um aplicativo que cuida de alguma lógica de negócios e não de uma biblioteca / estrutura a ser estendida?