緩く結合されたインターフェイスが必要だと仮定すると、メソッドシグネチャでList実装(ArrayListなど)を使用することを避け、Listインターフェイスを使用することを好むことがよくあります。しかし、コレクションはより一般的なインターフェイスなので、リストよりもコレクションを使用する方がよいと思いますか?
編集:私はリストとコレクションの違いを知っています。順序やリスト固有の機能は気にしません。そして、この質問は、戻り値とメソッドパラメータについてです。
緩く結合されたインターフェイスが必要だと仮定すると、メソッドシグネチャでList実装(ArrayListなど)を使用することを避け、Listインターフェイスを使用することを好むことがよくあります。しかし、コレクションはより一般的なインターフェイスなので、リストよりもコレクションを使用する方がよいと思いますか?
編集:私はリストとコレクションの違いを知っています。順序やリスト固有の機能は気にしません。そして、この質問は、戻り値とメソッドパラメータについてです。
(コレクションを拡張する)リストのドキュメントから:
順序付けられたコレクション(シーケンスとも呼ばれます)。このインターフェースのユーザーは、リストのどこに各要素を挿入するかを正確に制御できます。ユーザーは、整数インデックス(リスト内の位置)で要素にアクセスし、リスト内の要素を検索できます。
簡単に言うと、リストはその要素の順序(挿入順序または選択したその他の順序)を保持します。
したがって、これらのいずれかが気になる場合は、リストを使用してください。
優れたAPIは、不要な実装の詳細を公開することなく、必要なすべてを提供する必要があります。
ListまたはSetを最もよく使用しています。ListまたはSetをCollectionに置き換えようとすると、追加のデカップリングや抽象化を実際に提供せずにAPIを使用しにくくなることがあります。
入力/出力が複雑すぎることは明らかな兆候だと思うので、メソッドシグネチャでマップを避けようとしています。これは、このデータの特定のラッパークラスを作成するか、メソッドの場所を変更してデータに直接アクセスできるようにすることで解決できます(たとえば、メソッドに渡したクラスにデータを配置します)。
オブジェクト指向の設計は、コードの保守と呼び出しを容易にするためのものであり、完璧の聖杯を達成するためのものではないことを忘れないでください。通常、問題をモデル化するための賢明な方法はいくつかあります。どちらを選択するかは、自分のスタイルと、作業中のコードベースの予想される将来の複雑さ/ユースケースによって異なります。
List
私は、、またはまでしか行きませSet
んMap
。これにより、発信者は、具体的すぎることなく、何が返ってくると期待できるかをある程度示すことができます。
メソッドシグネチャの一部としてその表示を行うことが重要だと思います。それは彼らが結果を使用することを計画する方法を変えることができます。
例えば。Collection
のように一意のエントリを保証するものではありませんSet
。返さList
れるということは、結果が注文されることなどを意味します。
それはあなたが何をしようとしているのかによります。
順序が重要でない場合は、Collection
以上の意味がありList
ます。
一般的に言えば、あなたが示唆しているように、メソッドの要件を満たすために呼び出し元のコードが変換を行う必要がないように、メソッドパラメータで高レベルのインターフェイスを使用することをお勧めします。
場合によります。インターフェイスのCollection
セマンティクスは。とは異なりますList
。aの要素を反復処理する場合Collection
、要素が特定の順序で返されることは期待できません。(実際、一部のコレクションタイプでは、反復順序は実際には予測できません。)
List
さらに、APIを使用して実行できる操作と、 APIを使用して実行できない操作がいくつかありCollection
ます。特定の位置で要素を取得、挿入、または削除するなど。