Di recente ho letto @ImplementedBydell'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 @ImplementedBydell'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
@ImplementedBycon 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 @ImplementedByvalgono 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'@ImplementedByannotazione,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?