ポリモーフィズム: 「ArrayList list = new ArrayList」ではなく「List list = new ArrayList」を使用するのはなぜですか? [重複] 質問する

ポリモーフィズム: 「ArrayList list = new ArrayList」ではなく「List list = new ArrayList」を使用するのはなぜですか? [重複] 質問する

重複の可能性あり:
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

結局のところ、選択は単に設計の問題です...しかし、この種の設計は非常に重要です (特に大規模なプロジェクトで作業する場合)。既存のコードを壊すことなく、後で実装固有の変更を加えることができるためです。

おすすめ記事