Javaでプログラミングするとき、私はほとんどいつも、習慣から外れて、次のように書きます。
public List<String> foo() {
return new ArrayList<String>();
}
ほとんどの場合、それについて考えることさえありません。さて、問題は次のとおりです。常にインターフェイスをリターンタイプとして指定する必要がありますか?または、インターフェイスの実際の実装を使用することをお勧めしますか?使用する場合は、どのような状況で使用しますか?
インターフェイスを使用することには多くの利点があることは明らかです(それがそこにある理由です)。ほとんどの場合、ライブラリ関数がどの具体的な実装を使用するかは重要ではありません。しかし、それが問題になる場合もあるかもしれません。たとえば、私が主にリスト内のデータにランダムにアクセスすることがわかっている場合、aLinkedList
は悪いでしょう。しかし、私のライブラリ関数がインターフェイスのみを返す場合、私は単にわかりません。ArrayList
安全のために、リストを明示的に:にコピーする必要があるかもしれません。
List bar = foo();
List myList = bar instanceof LinkedList ? new ArrayList(bar) : bar;
しかし、それは恐ろしいことのように思われ、私の同僚はおそらく私をカフェテリアでリンチするでしょう。そして当然のことながらそうです。
皆さんはどう思いますか?あなたのガイドラインは何ですか、いつ抽象的な解決策に向かう傾向がありますか、そしていつ潜在的なパフォーマンス向上のためにあなたの実装の詳細を明らかにしますか?