重複の可能性あり:
Java クラスのインターフェースを優先する必要があるのはなぜですか?
いつ使うべきか
List<Object> list = new ArrayList<Object>();
ArrayList
は を継承しているList
ので、 の一部の機能ArrayList
が にない場合List
、 の一部の機能が失われることになりますArrayList
よね? また、コンパイラはこれらのメソッドにアクセスしようとするとエラーに気付くのでしょうか?
ベストアンサー1
これを実行する主な理由は、コードをインターフェースの特定の実装から分離するためです。次のようにコードを記述すると、
List list = new ArrayList();
コードの残りの部分では、データが 型であることのみが認識されます。これにより、インターフェースの異なる実装を簡単にList
切り替えることができるため、これが望ましい方法です。List
たとえば、かなり大規模なサードパーティ ライブラリを書いていて、ライブラリのコア部分を で実装することにしたとしますLinkedList
。ライブラリがこれらのリストの要素へのアクセスに大きく依存している場合、最終的には設計上の決定が間違っていたことに気付くでしょう。つまり、ArrayList
(アクセス時間が O(n))ではなくLinkedList
(アクセス時間が O(1))を使用すべきだったことに気付くでしょう。インターフェイスにプログラミングしていたと仮定すると、このような変更は簡単です。 のインスタンスを次のように変更するだけですList
。
List list = new LinkedList();
に
List list = new ArrayList();
インターフェイスによって提供される規約に従ってコードを記述したので、これが機能することがわかりますList
。
一方、ライブラリのコア部分を を使用して実装していた場合LinkedList list = new LinkedList()
、コードの残りの部分でクラス固有のメソッドが使用されないという保証がないため、このような変更はそれほど簡単ではありませんLinkedList
。
結局のところ、選択は単に設計の問題です...しかし、この種の設計は非常に重要です (特に大規模なプロジェクトで作業する場合)。既存のコードを壊すことなく、後で実装固有の変更を加えることができるためです。