タイトルの質問を参照してください!Comparator を「注入」するか、むしろ「新規」にしますか? 要素の順序が仕様で設定されており、変更されそうにない場合、それを新しくしますか?
4 に答える
「この依存関係を注入する必要がありますか?」という質問。本当に「参照オブジェクトはこの依存関係の性質を知っている必要がありますか?」えー、否定されただけです。
クラスがであり、速度でFastestPonyFinder
ソートする必要がある場合List<Pony>
は、コンパレータについて知っている必要があります。コンパレータは速度で比較し、リストの先頭まで最速でソートする必要があります。他のコンパレータはその仕事に適していません。オブジェクトは、を作成したのと同じように、コンパレータを作成する必要がありますList
。
クラスがである場合、BestPonyFinder
「最良」を構成するものの定義は、それに適合するポニーを見つける方法の定義から分離できるため、おそらくコンパレータを注入する必要があります。これにより、コードのテストと将来の変更が容易になります。
The thing about comparators is that they're cheap. They don't often have any fields, and if they do, they don't have many.
They're so cheap that it doesn't really matter. You can construct them inline, or get them from a static final field, or get a singleton injection -- who cares?
また、状態がない場合は、いつでも「再利用」できます。この場合、それらはスレッドセーフであり、以前の使用からの状態にはなりません。したがって、最終的には、コンパレータをどのように実装したかによって異なります。つまり、状態の有無にかかわらずです。
単体テストでは、 Comparator の新しいインスタンスを作成する方が適切ですが、コンパレータが比較メソッドを実装するだけかどうかは問題ではありません。いくつかのデータを状態としてコンパレーターに挿入し、変更可能な場合は、前と後のテストメソッドを使用して、以前のコンテキストを使用していないことを確認します。