• 締切済み

Java : インターフェースについて

List<String> list = new LinkedList<String>(); という宣言がありますが、これは本当に意味があるのでしょうか? 「呼び出し側が LinkedList の実装コードを意識せずにメソッドを呼び出すことができ、呼び出し側コードの再利用性と抽象性を高めることができる」 ということが考えとしてあるのかもしれませんが、この正当性がイマイチ理解できません。少なくとも、呼び出し側のコードも、ある程度は LinkedList か ArrayList かは考慮した上でのコードディングをしていないでしょうか(ランダムアクセスしやすいうんぬん)。List で宣言されていることにどれだけの意味があるのでしょうか? また、実際問題、list のメソッド使った際 Eclipse のコードジャンプで LinkedList の実装コードが一発で見れないため、どのような実装になっているのか調べたいときにすぐに確認できないというのも個人的には問題に感じます。 この宣言に本当に意味はありますか?本当に抽象化できていますか? 詳しい方よろしくお願いいたします。

みんなの回答

  • root139
  • ベストアンサー率60% (488/809)
回答No.2

質問者さんは主にローカル変数の型について疑問を持たれているのだと思います。 私の場合、ローカル変数の型については再利用性と抽象性を高めるというよりも書き手の意図を伝えるという部分が大きいですね。 したがって、必ずしも抽象的な型を使っている訳ではないです。 「Stringの集まりを使うよ。順序が必要だよ。」という意図を伝えたければ、 List<String> list = new LinkedList<String>(); となるでしょうし、実装型が限定されて、 LinkedList<String> list = new LinkedList<String>(); と書いてあれば、List<String> の時の意図に加えて「要素の挿入・削除の性能が必要だよ。」というものも含んでいるのでしょう。 逆に Collection<String> collection = new LinkedList<String>(); ならば、「Stringの集まりを使うよ。集まりなら何でも良いよ。実装はとりあえず LinkedList にしたよ。」という感じです。 ただし、メソッドの引数の型などについては別です。再利用性が如実に変わりますから。 例えば、LinkedListには下記の様なコンストラクタが有りますが、これ一つで ArrayList、LinkedList を始めとした数多のCollection実装のオブジェクトからインスタンスを作れます。 public LinkedList(Collection<? extends E> c) > Eclipse のコードジャンプで LinkedList の実装コードが一発で見れないため、どのような実装になっているのか調べたいときにすぐに確認できないというのも個人的には問題に感じます。 そんなあなたには Implementors プラグインがお勧めです。 http://www.eclipsewiki.net/eclipse/index.php?Implementors%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3

P_wannabe
質問者

お礼

ご回答ありがとうございます。 ローカル変数の場合ももちろんなのですが、クラス変数(フィールド)の場合でもイマイチどのようにして再利用性が高まるのかというのが理解できていないと思います。 解説していただいた内容は非常に分かり易いのですが、これはクラス変数の場合にはこの解説は当てはまらないのでしょうか? あと、「Implementors プラグイン」使ってみます。教えていただいてありがとうございました。

回答No.1

Listで実装されている範囲内での処理なら、呼び出し側はListを実装している クラスなら何でも渡せます。 自分の理解の範囲内ではLinkedListかもしれませんが、呼び出して処理したいな~ と思っている内容はListで処理しているので、呼び出し側がArrayListであったとしても 利用できます。 AさんはLinkedListでコードしてhogeという処理を実装、 BさんはArrayListでコードしてfugaという処理を実装、 それらは要件的に利用する型の変更は不可、 この時、hoge、fugaが同一処理で、List宣言だけで 処理可能なものだったとしたら? Listを実装しているクラスなら、呼び出し側で宣言されているクラスは 不問であることに意味があるでしょう。 また、ごりごりとプレゼンテーションとなるアプリケーションを作成する際に、 Javaで用意されているクラスのjavadocは見ても、ソースを参照することは稀でしょう。

P_wannabe
質問者

お礼

ご回答ありがとうございます。 ご回答内容を完全に理解できず若干的外れかもしれませんが、質問内容を再びまとめてみました。 --- インターフェース、クラスA、クラスBがあったとして、 インターフェース public List<String> getList(); クラス A implements インターフェース public List<String> getList(){ return new ArrayList<String>(); } クラス B implements インターフェース public List<String> getList(){ return new LinkedList<String>(); というような状況なら、返却型をList にして抽象化する意味を理解できます。 しかし、 List<String> list = new LinkedList<String>(); と宣言した場合、 「呼び出し元では完全に実装が決められているから、再利用性が高まるという意味が分からない。」 というのが私の疑問です。 この宣言の場合、どのように再利用性が高まっていると考えれば良いのでしょうか? 回答いただいた内容は、この宣言された list を使用するのは、”宣言したクラスのみ”ではなく、Aさん、Bさんも使うということなのでしょうか。 そう考えた場合、Aさん、Bさんはどのようにこの list を利用するのでしょう。 extends ?

関連するQ&A

専門家に質問してみよう