Di recente ho letto @ImplementedBy
dell'annotazione disponibile in Google Guice . Consente al programmatore di specificare un'associazione tra un'interfaccia e la sua implementazione per un uso futuro nell'iniezione delle dipendenze. È un esempio di associazione just-in-time .
Sono abbastanza abituato a definire collegamenti espliciti nei miei moduli, usando la sintassi seguente:
bind(SomeInterface.class).to(SomeInterfaceImplementation.class);
Secondo la documentazione, ciò equivale al seguente uso @ImplementedBy
dell'annotazione:
@ImplementedBy(SomeInterfaceImplementation.class)
public interface SomeInterface {
//method declarations
}
L'unico guadagno che posso vedere qui è che il codice è leggermente più corto. Allo stesso tempo, questo approccio ha giustamente sottolineato gli stessi documenti:
Usare
@ImplementedBy
con attenzione; aggiunge una dipendenza in fase di compilazione dall'interfaccia alla sua implementazione.
Tale dipendenza potrebbe non essere un problema in molti casi, ma personalmente lo vedo come un odore di codice.
Quali casi d'uso @ImplementedBy
valgono la pena utilizzare l' annotazione?
Un modo possibile sembra essere quello di impiegarlo nel codice di una libreria o di un framework. Come descritto nei documenti, l'annotazione può fornire un'associazione predefinita facilmente sostituibile da una esplicita.
Se un tipo si trova in entrambe le
bind()
istruzioni (come primo argomento) e ha l'@ImplementedBy
annotazione,bind()
viene utilizzata l' istruzione. L'annotazione suggerisce un'implementazione predefinita che può essere sovrascritta con un'associazione.
In questo modo, come sviluppatore di una libreria, posso fornire ai miei utenti un'associazione pronta per l'uso che può essere personalizzata da qualche parte nel codice client.
È questa l'unica ragione per cui esiste l'annotazione? O c'è qualcosa che mi manca? Posso ottenere qualcosa usandolo nel codice che è solo un'applicazione che si occupa di alcune logiche aziendali e non di una libreria / framework da estendere?