java.util Paket - Klassen vs Schnittstellen

8

Warum ist Warteschlange eine Schnittstelle, aber andere wie Stack und ArrayList sind Klassen?

Ich verstehe, dass Schnittstellen so erstellt werden, dass Clients sie implementieren und ihre eigenen Methoden hinzufügen können, während bei Klassen, wenn jeder Client seine Methoden dort benötigt, wird er riesig und aufgebläht.

... oder fehlt mir hier etwas?

    
Siddhartha 02.09.2012, 18:36
quelle

5 Antworten

7

A Queue kann auf verschiedene Arten implementiert werden, ebenso wie ein List oder ein Set . Sie alle spezifizieren lediglich einen Vertrag für verschiedene Arten von Sammlungen.

Ein ArrayList ist jedoch eine spezielle Implementierung von List , die intern verwendet wird, um ein Array zum Speichern von Elementen zu verwenden. LinkedList ist auch eine Implementierung von List , die eine Reihe miteinander verbundener Knoten verwendet, dh eine doppelt verknüpfte Liste . In ähnlicher Weise sind TreeSet und HashMap spezielle Implementierungen von Sets bzw. Maps.

Nun ist Stack hier ein merkwürdiger Fall, besonders weil es eine Legacy-Klasse aus älteren Java-Versionen ist. Du solltest wirklich kein Stack mehr benutzen; Stattdessen sollten Sie das moderne Äquivalent verwenden, das ArrayDeque . ArrayDeque ist eine Implementierung von Deque (eine doppelendige Warteschlange), die intern ein Array für den Speicher verwendet (was genau das ist, was Stack tut). A Deque unterstützt alle Operationen eines Stack , wie pop , push usw. Andere Implementierungen von Deque enthalten LinkedList , wie von jemand anderem erwähnt, obwohl dies von Stack abweicht. in diesem Grunde ist es kein Array, sondern eine doppelt verknüpfte Liste :-p

Nun gibt es viele Implementierungen von Queue und viele verschiedene Arten von Queue s. Sie haben nicht nur BlockingQueue s (oft für Erzeuger-Verbraucher verwendet), deren allgemeine Implementierungen LinkedBlockingQueue und ArrayBlockingQueue , sondern auch TransferQueue s usw. enthalten. Ich schweife ab ... Sie können mehr über das Collections API im entsprechenden Java Tutorial lesen / p>     

oldrinb 02.09.2012, 18:42
quelle
3

Sie bekommen die Idee von Schnittstellen richtig. In diesem Fall bietet die Java-Standardbibliothek bereits sowohl Implementierungen als auch Schnittstellen. Sie sollten eine Schnittstelle verwenden, damit Sie die Implementierung jederzeit wechseln können.

Ich hoffe, es macht Sinn.

    
Drakosha 02.09.2012 18:40
quelle
0

Ich denke, Stack ist bekannt dafür, eine Klasse zu sein, die eine Schnittstelle sein sollte. Die Java-Bibliotheken sind ein bisschen Zufall, wenn es darum geht, eine Schnittstelle richtig zu wählen.

ArrayList ist nur eine Implementierung der List -Schnittstelle, also hat Sun es dort richtig gemacht! Ein weiterer klassischer Fehler (meiner Meinung nach) ist die Klasse Observable , die sehr viel mehr die Standardimplementierung einer Schnittstelle als nur eine Klasse sein muss.

    
Duncan Jones 02.09.2012 18:41
quelle
0

Interessante Frage. Mein Gedanke dabei ist, dass Queue eine Basis für viele Datenstrukturen wie BlockingQueue, PriorityQueue, Deque usw. ist. Diese Klassen brauchen spezifische Implementierung für verschiedene Operationen, so dass es viel einfacher ist, Queue als Schnittstelle zu erstellen.

    
mishadoff 02.09.2012 18:46
quelle
0

Der Grund dafür, dass Schnittstellen für Liste und Warteschlange verwendet werden, ist NICHT , um übermäßigen Code zu reduzieren.

Der Hauptvorteil von Schnittstellen besteht darin, dass Sie flexiblen, lose gekoppelten Code schreiben können.

(Hier ist eine fantastische Antwort , die beschreibt dieses Konzept perfekt)

Eine Schnittstelle definiert einfach eine Liste von Methoden, die von einer Klasse implementiert werden.

Dies ermöglicht uns, eine wunderbar mächtige Sache zu machen:

  • Wir können alle Klassen behandeln, die eine Schnittstelle implementieren.

Das ist ein großer Vorteil.

Hier ist ein sehr einfaches Beispiel:

Wir möchten eine Debug-Methode schreiben, die jedes Element in einer Sammlung .

Sammlung ist eine Schnittstelle. Es definiert eine Liste von Operationen und implementiert sie nicht.

Sie können eine Sammlung nicht instanziieren . Sie können eine Klasse instanziieren, die Collection implementiert.

Es gibt viele Klassen, die Sammlung implementieren: ArrayList, Vector , TreeSet, LinkedList, etc ... Sie haben alle verschiedene pfiffige Features, aber sie auch haben bestimmte Gemeinsamkeiten: Weil jede Klasse Collection implementiert implementieren sie alle Methoden hier .

Dies ermöglicht uns eine sehr mächtige Sache:

  • Wir können eine Methode schreiben, die auf die Klasse ANY wirkt, die Collection implementiert.

Es würde genau so aussehen:

%Vor%

Wegen der Magie der Schnittstellen können wir jetzt folgendes tun:

%Vor%     
jahroy 02.09.2012 19:39
quelle

Tags und Links