質問
次のいずれかを決定する際に使用する基準は何ですか。
- アノテーションで依存関係を指定し、
- より具体的なインターフェースで依存関係を指定する
例
私が持っているとします:
interface FooLoader {
Foo loadById(long id);
}
class DBFooLoader implements FooLoader {
... jdbc etc. etc. ...
}
class CachingFooLoader implements FooLoader {
...
@Inject
public CachingFooLoader(FooLoader delegate) {
this.delegate = delegate;
}
...
}
にバインドFooLoader
したいとしCachingFooLoader
ます。これを配線するには [少なくとも] 2 つの方法があります。
注釈バインディングを使用する
変化する:
public CachingFooLoader(FooLoader delegate)
に:
public CachingFooLoader(@NonCaching FooLoader delegate)
その後:
bind(FooLoader.class).annotatedWith(NonCaching.class).to(DBFooLoader.class);
より具体的なインターフェースを作成する
変化する:
public CachingFooLoader(FooLoader delegate)
に:
public CachingFooLoader(NonCachingFooLoader delegate)
where はNonCachingFooLoader
単に extendsFooLoader
をDBFooLoader
実装しNonCachingFooLoader
、それに応じて接続します。
私の考え
私は複数の理由で注釈バインディングを使用することに惹かれています。
- キーはインターフェイスよりも簡単に再利用できるため、インターフェイスが被る組み合わせの爆発が減少します。
- 侵襲性が低くなります。構成は、クラスを「汚染」するのではなく、Guice モジュールにとどまります。
ただし、より具体的なインターフェイスを作成することには利点もあります。
- インターフェイスにはより多くの意味があります。通常、Guice だけが注釈を読み取りますが、インターフェイスはさらに多くの用途に使用されます。
では、どのアプローチを採用するかを決定するには、どのような基準を使用する必要がありますか?
(春のユーザーは、私が知る限り、これは修飾子と呼ばれるものです。)