8

キューがインターフェイスであるのに、StackArrayListなどの他のクラスがクラスであるのはなぜですか?

インターフェイスは、クライアントがそれらを実装して独自のメソッドを追加できるように作成されていることを理解していますが、クラスでは、すべてのクライアントがそこでメソッドを必要とする場合、インターフェイスは巨大で肥大化するでしょう。

...または私はここで何かが欠けていますか?

4

5 に答える 5

7

は、またはと同様に、さまざまなQueue方法で実装できます。それらはすべて、さまざまな種類のコレクションの契約を指定するだけです。ListSet

ArrayListただし、は、List要素を格納するために配列を内部的に使用するように作成された、の特定の実装です。は、一連の相互接続されたノード、つまり二重リンクリストLinkedListを使用するの実装でもあります。同様に、とはそれぞれセットとマップの特定の実装です。ListTreeSetHashMap

さて、Stackここでは奇妙なケースです。特に、古いバージョンのJavaのレガシークラスであるためです。あなたは本当にStackもう使うべきではありません。代わりに、その最新の同等物であるを使用する必要がありますArrayDequeArrayDequeDeque(両端キュー)の実装であり、内部的に配列をストレージに使用します(これがまさにそのStack機能です)。Aは、などのDequeすべての操作をサポートします。他の誰かが言及したように、 includeの他の実装は、その基礎となる配列ではなく、二重にリンクされたリストから逸脱しています:-pStackpoppushDequeLinkedListStack

現在、の実装はたくさんあり、Queueさまざまな種類のがありQueueます。BlockingQueues(生産者/消費者によく使用されます)があり、その一般的な実装にはとが含まれLinkedBlockingQueueているだけArrayBlockingQueueでなく、TransferQueuesなども含まれています。私は逸脱します...関連するJavaチュートリアルでコレクションAPIの詳細を読むことができます。

于 2012-09-02T18:42:25.130 に答える
3

インターフェースの概念を正しく理解できます。この場合、Java標準ライブラリはすでに実装とインターフェースの両方を提供しています。いつでも実装を切り替えることができるように、インターフェイスを使用することをお勧めします。

それが理にかなっていることを願っています。

于 2012-09-02T18:40:37.083 に答える
0

インターフェイスがリストとキューに使用される理由は、過剰なコードを減らすため ではありません。

インターフェイスの主な利点は、柔軟で疎結合のコードを記述できることです。

(これは、この概念を完全に説明する素晴らしい答えです)

インターフェイスは、クラスによって実装されるメソッドのリストを定義するだけです。

これにより、非常に強力なことが可能になります。

  • インターフェイスを実装するすべてのクラスを同じように扱うことができます。

これは大きな利点です。

非常に簡単な例を次に示します。

コレクション内のすべての要素を出力するデバッグメソッドを作成します。

コレクションはインターフェースです。操作のリストを定義し、それらを実装しません。

コレクションをインスタンス化することはできません。Collectionを実装するクラスをインスタンス化できます。

Collectionを実装するクラスはたくさんあります:ArrayList、Vector、TreeSet、LinkedListなど。これらはすべて異なる洗練された機能を備えていますが、共通点もあります。各クラスはCollectionを実装しているため、ここにある各メソッドを実装しています。

これにより、非常に強力なことが可能になります。

  • Collectionを実装する任意のクラスで動作するメソッドを記述できます

次のようになります。

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);
}
于 2012-09-02T19:39:25.777 に答える
0

Stackインターフェースとなるべきクラスとして有名だと思います。インターフェースを提供することを正しく選択することになると、Javaライブラリーは少し行き当たりばったりです。

ArrayListListインターフェースの単なる実装であるため、Sunはそこで正しくそれを取得しました!もう1つの古典的なミス(私の意見では)はObservableクラスです。これは、単なるクラスではなく、インターフェイスのデフォルトの実装である必要があります。

于 2012-09-02T18:41:57.763 に答える
0

興味深い質問です。これについての私の考えQueueは、BlockingQueue、PriorityQueue、Dequeなどの多くのデータ構造の基礎です。この一連のクラスには、さまざまな操作のための特定の実装が必要であるためQueue、インターフェイスとして作成する方がはるかに簡単です。

于 2012-09-02T18:46:11.457 に答える