Yabu.log

ITなどの雑記

Effective Java Item 5: Prefer dependency injection to hardwiring resources

ハードコーディングではなくDIを使いましょう。

Effective Java (3rd Edition)

Effective Java (3rd Edition)

  • スペルチェッカークラス
  • 辞書クラス

static utilityとシングルトン

スペルチェッカーは辞書クラスのメンバを利用するので、依存関係があります。 どのように実装するか?

  • static utilityとして辞書クラスをスペルチェッカークラスにハードコーディング
  • シングルトンとして辞書クラスをスペルチェッカークラスにハードコーディング

などが考えられますが、staticのutilクラスもsingletonも数種類のリソースに依存したインスタンスを複数作り分けたい用途には向きません 具体的にはスペルチェックの機能はそのままに、確認する語彙を切り替えたインスタンスが欲しいというような用途に向きません。

DIを使いましょう

複数のリソースを柔軟に切り替えて扱う方法の一つにDI(Dependency Injection)こと依存性の注入があります 具体的な方法として

  • コンストラクタで依存性のあるクラスを与え初期化する
  • ファクトリメソッドで依存性のあるクラスやファクトリを与えてインスタンスを得る

などの方法があります。

などのフレームワークを使いましょう。

感想

DAOが引数なしコンストラクタで初期化されている(ハードコーディング)されているサービスクラスで、 テストのために、DIを行う用のコンストラクタを作ろうとしたことがある。

そこまで手間なことはやっていないと思うけど、なぜこの用途のフレームワークがあるのかよくわからない。