Ich habe kürzlich über die @ImplementedBy
in Google Guice verfügbaren Anmerkungen gelesen . Es ermöglicht dem Programmierer, eine Bindung zwischen einer Schnittstelle und ihrer Implementierung für die zukünftige Verwendung bei der Abhängigkeitsinjektion anzugeben. Dies ist ein Beispiel für eine Just-in-Time-Bindung .
Ich bin es gewohnt, explizite Bindungen in meinen Modulen mit der folgenden Syntax zu definieren:
bind(SomeInterface.class).to(SomeInterfaceImplementation.class);
Dies entspricht laut Dokumentation der folgenden Verwendung der @ImplementedBy
Anmerkung:
@ImplementedBy(SomeInterfaceImplementation.class)
public interface SomeInterface {
//method declarations
}
Der einzige Vorteil, den ich hier sehen kann, ist, dass der Code geringfügig kürzer ist. Gleichzeitig hat dieser Ansatz einen Nachteil, auf den in denselben Dokumenten zu Recht hingewiesen wird:
Verwenden Sie
@ImplementedBy
sorgfältig; Es fügt seiner Implementierung eine Abhängigkeit zur Kompilierungszeit von der Schnittstelle hinzu.
Eine solche Abhängigkeit mag in vielen Fällen kein Problem sein, aber ich persönlich sehe sie als Codegeruch.
In welchen Anwendungsfällen @ImplementedBy
lohnt sich die Verwendung der Anmerkung?
Ein möglicher Weg scheint darin zu bestehen, es im Code einer Bibliothek oder eines Frameworks zu verwenden. Wie in den Dokumenten beschrieben, kann die Anmerkung eine Standardbindung bereitstellen, die leicht durch eine explizite überschrieben werden kann.
Befindet sich ein Typ sowohl in einer
bind()
Anweisung (als erstes Argument) als auch mit der@ImplementedBy
Anmerkung, wird diebind()
Anweisung verwendet. Die Anmerkung schlägt eine Standardimplementierung vor , die mit einer Bindung überschrieben werden kann.
Auf diese Weise kann ich als Entwickler einer Bibliothek meinen Benutzern eine sofort einsatzbereite Bindung zur Verfügung stellen, die irgendwo im Client-Code angepasst werden kann.
Ist dies der einzige Grund für das Vorhandensein der Anmerkung? Oder fehlt mir etwas? Kann ich etwas gewinnen, indem ich es in Code verwende, der nur eine Anwendung ist, die sich um eine Geschäftslogik kümmert, und keine Bibliothek / ein Framework, das erweitert werden soll?