2012-09-02 12 views
8

なぜQueueインターフェースですが、StackArrayListのような他の人がクラスですか?java.utilパッケージ - クラス対インタフェース

私は

..クライアントはそれらを実装し、独自の方法で追加できるように、すべてのクライアントがそこに彼らの方法を必要とする場合、クラスでそれは巨大で肥大化になるだろう一方のインターフェイスが、行われていることを理解して...か私はここに何かを逃している?

+2

あなたが正しく穏やかな矛盾を発見しました。 Javaは全体的にはかなり良いですが、ここでは「何もない世界」は間違いありません。 :-) 以下のVeerの答えはStackは古いバージョンのものだと言及していますが、時にはすべてが固執することがあります。 –

+0

興味深いことに、 'Queue' APIドキュメントの「使用」をクリックすると、実装が見えますが、実際にはそれを使用するものはありません。通常の使用では、クラス内でプライベートに使用されます。インタフェースが存在しない場合、大きな影響はありません。 –

答えて

7

Queueは、ListまたはSetのように、いくつかの方法で実装できます。彼らはすべて、さまざまなコレクションの契約を指定するだけです。

しかし、ArrayListは、要素を格納するための配列を内部的に使用するために作られたListの特定の実装です。 LinkedListは、一連の相互接続されたノード、すなわちdoubly linked listを使用するListの実装でもあります。同様に、TreeSetおよびHashMapは、それぞれセットおよびマップの特定の実装である。

は今、Stackは、それは、Javaの古いバージョンからのレガシークラスであり、特にので、ここでは奇数の場合です。あなたは本当にもうStackを使うべきではありません。代わりに、現代の同等品のArrayDequeを使用してください。 ArrayDequeは、内部(Stackがするだけで何である)ストレージの配列を使用すること、Dequeの実装(両端キュー)です。 Dequeは、他の誰かが述べたように、これはそれが配列ではなく、二重リンク基礎となるものでStackから外れたもののDequeの他の実装は、LinkedListを含めるなど、poppushのように、Stackの操作のすべてをサポートしていますリスト:-p

Queueと多くの異なるタイプのQueueの実装がたくさんあります。あなただけのようにその一般的な実装LinkedBlockingQueueArrayBlockingQueueが含まBlockingQueue S(多くの場合、生産者 - 消費者のために使用される)、だけでなく、TransferQueue、S、及びを持っていません。私は逃げ出します...関連するJava TutorialのコレクションAPIについてもっと読むことができます。

+0

あなたの答えをありがとう。遅れてお詫び申し上げます。私はこれを読んで覚えていますが、それは理にかなっていましたが、 – Siddhartha

3

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

希望します。

0

私はStackはインターフェイスする必要がありますクラスであるために、よく有名だと思います。 Javaライブラリは、インタフェースを提供することを正しく選択するという点で、ちょっとしたヒットミスです。

ArrayListは、Listインターフェイスの実装に過ぎません。したがって、Sunはそれを正しく取得しました。別の古典的なミス(私の意見では)は、Observableクラスです。これは単なるクラスではなく、インターフェイスのデフォルトの実装である必要があります。

+0

'Observable'は非常に1.0クラスです。もう少し現代的なものは、 'java.beans.PropertyChangeSupport'です。 –

0

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

0

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

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

(ここでは完全にこの概念を説明しawesome answerだ)

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

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

    これは、私たちは素晴らしくパワフルなことを行うことができます。

これは大きな利点です。

我々はCollection内のすべての要素を出力するデバッグ方法を書きたい:

はここで非常に簡単な例です。

Collectionはインターフェイスです。これは操作のリストを定義し、操作のリストを実装しません。

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

Collectionを実装する多くのクラスがあります。ArrayListに、ベクトル、TreeSetの、LinkedListの、などが...彼らはすべての異なる粋な特徴を持っていますが、彼らはまた、は共通して、特定のものを持っている:各クラスは、コレクションを実装しているための場合は、それぞれすべてのメソッドfound hereを実装します。

  • 私たちは、コレクションを実装ANYクラスで動作するメソッドを書くことができます:

    これは、私たちは非常に強力なことを行うことができます。

それはちょうど次のようになります。

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); 
} 
関連する問題