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?
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>
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.
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.
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.
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:
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:
Es würde genau so aussehen:
%Vor%Wegen der Magie der Schnittstellen können wir jetzt folgendes tun:
%Vor%