なぜQueueインターフェースですが、StackとArrayListのような他の人がクラスですか?java.utilパッケージ - クラス対インタフェース
私は
..クライアントはそれらを実装し、独自の方法で追加できるように、すべてのクライアントがそこに彼らの方法を必要とする場合、クラスでそれは巨大で肥大化になるだろう一方のインターフェイスが、行われていることを理解して...か私はここに何かを逃している?
なぜQueueインターフェースですが、StackとArrayListのような他の人がクラスですか?java.utilパッケージ - クラス対インタフェース
私は
..クライアントはそれらを実装し、独自の方法で追加できるように、すべてのクライアントがそこに彼らの方法を必要とする場合、クラスでそれは巨大で肥大化になるだろう一方のインターフェイスが、行われていることを理解して...か私はここに何かを逃している?
Queue
は、List
またはSet
のように、いくつかの方法で実装できます。彼らはすべて、さまざまなコレクションの契約を指定するだけです。
しかし、ArrayList
は、要素を格納するための配列を内部的に使用するために作られたList
の特定の実装です。 LinkedList
は、一連の相互接続されたノード、すなわちdoubly linked listを使用するList
の実装でもあります。同様に、TreeSet
およびHashMap
は、それぞれセットおよびマップの特定の実装である。
は今、Stack
は、それは、Javaの古いバージョンからのレガシークラスであり、特にので、ここでは奇数の場合です。あなたは本当にもうStack
を使うべきではありません。代わりに、現代の同等品のArrayDeque
を使用してください。 ArrayDeque
は、内部(Stack
がするだけで何である)ストレージの配列を使用すること、Deque
の実装(両端キュー)です。 Deque
は、他の誰かが述べたように、これはそれが配列ではなく、二重リンク基礎となるものでStack
から外れたもののDeque
の他の実装は、LinkedList
を含めるなど、pop
、push
のように、Stack
の操作のすべてをサポートしていますリスト:-p
Queue
と多くの異なるタイプのQueue
の実装がたくさんあります。あなただけのようにその一般的な実装LinkedBlockingQueue
とArrayBlockingQueue
が含まBlockingQueue
S(多くの場合、生産者 - 消費者のために使用される)、だけでなく、TransferQueue
、S、及びを持っていません。私は逃げ出します...関連するJava TutorialのコレクションAPIについてもっと読むことができます。
あなたの答えをありがとう。遅れてお詫び申し上げます。私はこれを読んで覚えていますが、それは理にかなっていましたが、 – Siddhartha
あなたはインターフェイスの考え方を正しく理解しています。この場合、Java標準ライブラリは実装とインタフェースの両方を既に提供しています。 インターフェイスを使用する方がよいので、実装をいつでも切り替えることができます。
希望します。
私はStack
はインターフェイスする必要がありますクラスであるために、よく有名だと思います。 Javaライブラリは、インタフェースを提供することを正しく選択するという点で、ちょっとしたヒットミスです。
ArrayList
は、List
インターフェイスの実装に過ぎません。したがって、Sunはそれを正しく取得しました。別の古典的なミス(私の意見では)は、Observable
クラスです。これは単なるクラスではなく、インターフェイスのデフォルトの実装である必要があります。
'Observable'は非常に1.0クラスです。もう少し現代的なものは、 'java.beans.PropertyChangeSupport'です。 –
興味深い質問です。これについての私の考えは、Queue
は、BlockingQueue、PriorityQueue、Dequeなどのような多くのデータ構造の基礎となります。このクラスのクラスは、さまざまな操作のための特定の実装を必要とするので、インターフェイスとしてQueue
を作成する方がはるかに簡単です。
インターフェイスがリストとキューに使用される理由は、過剰なコードを減らすためにNOTです。
インターフェイスの主な利点は、柔軟で疎結合のコードを書くことができることです。
(ここでは完全にこの概念を説明しawesome answerだ)
インターフェースは、単にクラスによって実装されるメソッドのリストを定義します。
これは、私たちは素晴らしくパワフルなことを行うことができます。
これは大きな利点です。
我々はCollection内のすべての要素を出力するデバッグ方法を書きたい:
はここで非常に簡単な例です。
Collectionはインターフェイスです。これは操作のリストを定義し、操作のリストを実装しません。
できませんコレクションをインスタンス化します。 canは、Collectionを実装するクラスをインスタンス化します。
Collectionを実装する多くのクラスがあります。ArrayListに、ベクトル、TreeSetの、LinkedListの、などが...彼らはすべての異なる粋な特徴を持っていますが、彼らはまた、は共通して、特定のものを持っている:各クラスは、コレクションを実装しているための場合は、それぞれすべてのメソッドfound hereを実装します。
これは、私たちは非常に強力なことを行うことができます。
それはちょうど次のようになります。
public void printCollection(Collection semeCollection) {
for (Object o : someCollection) {
String s = (o == null) ? "null" : o.toString();
System.out.println(s);
}
}
のためのインタフェースの魔法の、我々は今、次の操作を行うことができます。
public void testStuff() {
Collection s = new TreeSet();
Collection a = new ArrayList();
Collection v = new Vector();
s.add("I am a set");
a.add("I am an array list");
v.add("I am a vector");
printCollection(s);
printCollection(a);
printCollection(v);
}
あなたが正しく穏やかな矛盾を発見しました。 Javaは全体的にはかなり良いですが、ここでは「何もない世界」は間違いありません。 :-) 以下のVeerの答えはStackは古いバージョンのものだと言及していますが、時にはすべてが固執することがあります。 –
興味深いことに、 'Queue' APIドキュメントの「使用」をクリックすると、実装が見えますが、実際にはそれを使用するものはありません。通常の使用では、クラス内でプライベートに使用されます。インタフェースが存在しない場合、大きな影響はありません。 –