最近@ImplementedBy
、Google Guiceで利用できるアノテーションについて読みました。プログラマーは、依存関係注入で将来使用するために、インターフェースとその実装の間のバインディングを指定できます。これは、ジャストインタイムバインディングの例です。
次の構文を使用して、モジュールで明示的なバインディングを定義することに慣れています。
bind(SomeInterface.class).to(SomeInterfaceImplementation.class);
ドキュメントによると、これは次の@ImplementedBy
アノテーションの使用と同等です。
@ImplementedBy(SomeInterfaceImplementation.class)
public interface SomeInterface {
//method declarations
}
ここでわかる唯一の利点は、コードがわずかに短いことです。同時に、このアプローチには、同じドキュメントで正しく指摘されている欠点があります。
@ImplementedBy
慎重に使用してください。インターフェイスからその実装にコンパイル時の依存関係を追加します。
そのような依存関係は多くの場合問題にはならないかもしれませんが、私は個人的にそれをコードのにおいとして見ています。
@ImplementedBy
アノテーションを使用する価値のあるユースケースは何ですか?
1つの可能な方法は、ライブラリまたはフレームワークのコードで使用することです。ドキュメントで説明されているように、アノテーションは明示的なバインディングによって簡単にオーバーライドされるデフォルトのバインディングを提供できます。
タイプが
bind()
(最初の引数として)ステートメント内にあり、@ImplementedBy
注釈がある場合、そのbind()
ステートメントが使用されます。このアノテーションは、バインディングでオーバーライドできるデフォルトの実装を提案しています。
このようにして、ライブラリの開発者として、クライアントコードのどこかでカスタマイズできるすぐに使えるバインディングをユーザーに提供できます。
これが注釈が存在する唯一の理由ですか?それとも私が見逃しているものはありますか?ライブラリ/フレームワークを拡張するのではなく、いくつかのビジネスロジックを処理するアプリケーションだけのコードでそれを使用することで何かを得ることはできますか?