2013-03-19 19 views
5
Collection list = new LinkedList(); // Good? 
LinkedList list = new LinkedList(); // Bad? 

Erste Variante gibt mehr Flexibilität, aber ist das alles? Gibt es andere Gründe, es zu bevorzugen? Was ist mit Leistung?Ist eine Sammlung besser als eine LinkedList?

+1

Sammlung ist eine Schnittstelle, die von LinkedList implementiert wird. Sie sollten immer mit einer Schnittstelle auf die Implementierung verweisen. – emd

Antwort

7

Dies sind Designentscheidungen, und eine Größe passt normalerweise nicht für alle. Auch die Auswahl dessen, was intern für die Elementvariable verwendet wird, kann (und sollte normalerweise) von dem abweichen, was der Außenwelt ausgesetzt ist.

Im Kern bietet das Collections-Framework von Java keine vollständigen Schnittstellen, die die Eigenschaften beschreiben, ohne die Implementierungsdetails offenzulegen. Die eine Schnittstelle, die die Leistung beschreibt, RandomAccess, ist eine Markierungsschnittstelle und erweitert nicht einmal Collection oder stellt die get(index)-API erneut offen. Also ich denke nicht, dass es eine gute Antwort gibt.

Als Faustregel halte ich den Typ so unspezifisch wie möglich, bis ich ein wichtiges Merkmal erkenne (und dokumentiere). Wenn ich beispielsweise möchte, dass Methoden wissen, dass der Anzeigenauftrag beibehalten wird, würde ich von Collection zu List wechseln und dokumentieren, warum diese Einschränkung wichtig ist. In ähnlicher Weise bewegen Sie sich von List zu LinkedList, wenn eine effiziente Entfernung von vorne wichtig wird.

Wenn es darum geht, die Sammlung in öffentlichen APIs offenzulegen, versuche ich immer, nur die wenigen APIs zu veröffentlichen, von denen erwartet wird, dass sie verwendet werden; zum Beispiel add(...) und iterator().

0

Sie sind absolut gleichwertig. Der einzige Grund, einen zu verwenden, besteht darin, dass Sie, wenn Sie später eine Funktion der Liste verwenden möchten, die nur in der Klasse LinkedList existiert, den zweiten verwenden müssen.

2
Collection list = new LinkedList(); //bad 

Das ist schlecht, weil Sie nicht über diese Referenz wollen eine HashSet verweisen sagen (wie HashSet auch Sammlung implementiert und so auch viele andere Klassen in der Sammlung Framework).

Das ist schlecht, weil es eine gute Übung ist, immer an die Schnittstelle zu codieren.

List list = new LinkedList();//good 

Das ist gut, weil Punkt 2 Tage so. (Always Program To an Interface)

+1

Warum die Verwendung der Liste ist gut und die Verwendung der Sammlung ist schlecht? – GraphicsToBe

+0

@GraphicsToBe überprüfen Sie meine Bearbeitung :) – PermGenError

+1

@Aboutblank Array ist keine Sammlung und auch Map ist keine Sammlung :) – PermGenError

1

Sicher. Wenn Java beispielsweise eine effizientere Implementierung für die List-Auflistung findet und implementiert, Sie aber bereits eine API haben, die nur LinkedList akzeptiert, können Sie die Implementierung nicht ersetzen, wenn Sie bereits Clients für diese API haben. Wenn Sie die Schnittstelle verwenden, können Sie die Implementierung problemlos ersetzen, ohne die APIs zu unterbrechen.

2

Verwenden Sie die spezifischsten Informationen zu nicht öffentlichen Objekten. Sie sind Implementierungsdetails und wir möchten, dass unsere Implementierungsdetails so spezifisch und genau wie möglich sind.

0

Meine allgemeine Regel ist, nur so spezifisch zu sein, wie Sie zu der Zeit sein müssen (oder müssen in naher Zukunft sein, innerhalb des Grundes). Zugegeben, das ist etwas subjektiv.

In Ihrem Beispiel würde ich erklären, es in der Regel als List nur, weil die zur Verfügung stehenden Methoden auf Collection nicht sehr stark sind, und die Unterscheidung zwischen einem List und anderen Collection (Map, Set, etc.) ist oft logisch signifikant.

Auch in Java 1.5+ verwenden Sie keine unformatierten Typen - wenn Sie den Typ Ihrer Liste nicht kennen, verwenden Sie mindestens List<?>.

+0

Irgendein Grund für den Downvote? – ach

Verwandte Themen