Di recente ho letto sull'annotazione @ImplementedBy
disponibile in Google Guice . Consente al programmatore di specificare un'associazione tra un'interfaccia e la sua implementazione per l'uso futuro nell'integrazione delle dipendenze. È un esempio di associazione in tempo limitato .
Sono abbastanza abituato a definire collegamenti espliciti nei miei moduli, usando la seguente sintassi:
bind(SomeInterface.class).to(SomeInterfaceImplementation.class);
Secondo la documentazione, questo è equivalente al seguente uso dell'annotazione @ImplementedBy
:
@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 uno svantaggio giustamente sottolineato dagli stessi documenti:
Use
@ImplementedBy
carefully; it adds a compile-time dependency from the interface to its implementation.
Tale dipendenza potrebbe non essere un problema in molti casi, ma personalmente la vedo come un odore di codice.
Quali casi d'uso rendono utile l'annotazione @ImplementedBy
?
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 binding predefinito facilmente sostituito da uno esplicito.
If a type is in both a
bind()
statement (as the first argument) and has the@ImplementedBy
annotation, thebind()
statement is used. The annotation suggests a default implementation that can be overridden with a binding.
In questo modo, come sviluppatore di una libreria, posso fornire ai miei utenti un binding che può essere personalizzato da qualche parte nel codice client.
Questa è l'unica ragione per cui esiste l'annotazione? O c'è qualcosa che mi manca? Posso ottenere qualcosa utilizzando il codice che è solo un'applicazione che si occupa di alcune logiche di business e non una libreria / framework da estendere?