具体的なクラスの代わりにインターフェースを返すことに同意していることに気づきました。
理由は簡単です。緩い結合が必要です。
しかし、他の影響やトレードオフはありますか?
インターフェイスに適した最も一般的なタイプを返すのが最善です。
返すデータに本質的に適切である理由ArrayList
がある場合は、それを使用する必要があります。通常は問題ありませんが、戻り値が本質的に順序付けされていない場合は、List
使用を検討することもできます。Collection
ListやArrayListのようなタイプの場合、複雑になることはなく、Listプロモートコードをインターフェイスに返す必要があります。
これがCopyOnWriteArrayListのような並行性パッケージからのものであり、Listインターフェースで定義されていないaddIfAbsentのようなメソッドを使用していた場合、そうすることは制限されていることに気付くでしょう。
したがって、ArrayListまたはその具体的な実装を返す場合は、コントラクト(インターフェイス)で定義されていないAPIを使用できますが、特定の実装から別の実装(から)List
に変更することは制限されます。APIは、変更に応じて変更する必要があります。期待しすぎだと思います。ArrayList
LinkedList
つまり、返されたオブジェクトArrayList
のインターフェイスのメソッドではないメソッドを呼び出すことはできません。List
ただし、オブジェクトがであるArrayList
場合は、キャストを行うことができます。
具象クラスを返す唯一の理由は、呼び出し元がこの具象実装、または場合によっては具象実装の追加インターフェースを認識する必要がある場合です。たとえば、Androidでは、フレームワークがジェネリックインターフェイスArrayList
を適切にシリアル化する方法を認識していないため、使用する必要があります。List