Effective Java Item 5: Prefer dependency injection to hardwiring resources
ハードコーディングではなくDIを使いましょう。
- 作者: Joshua Bloch
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2018/01/06
- メディア: ペーパーバック
- この商品を含むブログ (2件) を見る
- スペルチェッカークラス
- 辞書クラス
static utilityとシングルトン
スペルチェッカーは辞書クラスのメンバを利用するので、依存関係があります。 どのように実装するか?
- static utilityとして辞書クラスをスペルチェッカークラスにハードコーディング
- シングルトンとして辞書クラスをスペルチェッカークラスにハードコーディング
などが考えられますが、staticのutilクラスもsingletonも数種類のリソースに依存したインスタンスを複数作り分けたい用途には向きません 具体的にはスペルチェックの機能はそのままに、確認する語彙を切り替えたインスタンスが欲しいというような用途に向きません。
DIを使いましょう
複数のリソースを柔軟に切り替えて扱う方法の一つにDI(Dependency Injection)こと依存性の注入があります 具体的な方法として
- コンストラクタで依存性のあるクラスを与え初期化する
- ファクトリメソッドで依存性のあるクラスやファクトリを与えてインスタンスを得る
などの方法があります。
- Dagger
- Guice
- Spring
などのフレームワークを使いましょう。
感想
DAOが引数なしコンストラクタで初期化されている(ハードコーディング)されているサービスクラスで、 テストのために、DIを行う用のコンストラクタを作ろうとしたことがある。
そこまで手間なことはやっていないと思うけど、なぜこの用途のフレームワークがあるのかよくわからない。