J'ai récemment lu l' @ImplementedBy
annotation disponible dans Google Guice . Il permet au programmeur de spécifier une liaison entre une interface et son implémentation pour une utilisation future dans l'injection de dépendances. Il s'agit d'un exemple de liaison juste à temps .
Je suis assez habitué à définir des liaisons explicites dans mes modules, en utilisant la syntaxe suivante:
bind(SomeInterface.class).to(SomeInterfaceImplementation.class);
Selon la documentation, cela équivaut à l'utilisation suivante de l' @ImplementedBy
annotation:
@ImplementedBy(SomeInterfaceImplementation.class)
public interface SomeInterface {
//method declarations
}
Le seul gain que je peux voir ici est que le code est légèrement plus court. Dans le même temps, cette approche présente un inconvénient signalé à juste titre par les mêmes documents:
Utilisez
@ImplementedBy
avec précaution; il ajoute une dépendance au moment de la compilation de l'interface à son implémentation.
Une telle dépendance peut ne pas être un problème dans de nombreux cas, mais je la vois personnellement comme une odeur de code.
Quels cas d'utilisation @ImplementedBy
valent la peine d'être annotés?
Une façon possible semble être de l'utiliser dans le code d'une bibliothèque ou d'un framework. Comme décrit dans la documentation, l'annotation peut fournir une liaison par défaut facilement remplacée par une explicite.
Si un type se trouve à la fois dans une
bind()
instruction (comme premier argument) et possède l'@ImplementedBy
annotation, l'bind()
instruction est utilisée. L'annotation suggère une implémentation par défaut qui peut être remplacée par une liaison.
De cette façon, en tant que développeur d'une bibliothèque, je peux fournir à mes utilisateurs une liaison prête à l'emploi qui peut être personnalisée quelque part dans le code client.
Est-ce la seule raison pour laquelle l'annotation existe? Ou y a-t-il quelque chose qui me manque? Puis-je gagner quelque chose en l'utilisant dans du code qui n'est qu'une application prenant en charge une logique métier et non une bibliothèque / un cadre à étendre?