2013-08-28 18 views
6

Im Folgenden sind zwei Möglichkeiten, wie ArrayList erstellen:Wie man ArrayList richtig erstellt?

List<String/*or other object*/> arrList = new ArrayList();//Imports List, ArrayList 
ArrayList<String/*or other object*/> arrList = new ArrayList();//Imports just ArrayList 

Was ist der Unterschied? Welche Methode sollte verwendet werden?

+3

Mit Former können Sie _abstraction_ nutzen. – rocketboy

+2

Abgesehen von der offensichtlichen Antwort sollten Sie sich keine Gedanken über Importe machen. Sie beeinflussen die Leistung zur Laufzeit nicht. –

+1

Werfen Sie einen Blick auf [Was-bedeutet-es-zu-Programm-zu-einem-Interface] (http://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to (an-interface) – Pshemo

Antwort

6

Das erste Formular wird empfohlen für die öffentliche Schnittstelle einer Klasse (sagen wir die Deklaration der Attribute in einer Klasse). Es ist ein bekannter Ratschlag, dass Sie für eine Schnittstelle programmieren sollten, nicht für eine konkrete Implementierung (das steht in Design Patterns) - die Anzahl der Klassen, die Sie importieren müssen, hat wenig mit der Qualität des Codes und gutem Design zu tun. Der Vorteil der ersten Form besteht darin, dass Sie Implementierungen später leicht austauschen können, wenn dies erforderlich ist - während die zweite Implementierung die Implementierungsklasse festlegt und Ihren Code schwieriger zu entwickeln und weniger flexibel macht.

Es gibt Fälle, in denen es zwar möglich ist, konkrete Klassen zu deklarieren und zu verwenden (z. B. für eine kleine Leistungssteigerung). Die öffentliche Schnittstelle einer Klasse sollte jedoch nach Möglichkeit Schnittstellen verwenden, damit zukünftige Änderungen einfacher implementiert werden können.

+0

Als ich die Frage las, war ich mir sicher, dass innerhalb von Sekunden eine Menge Leute diese oder eine ähnliche Antwort geben würden (wenn niemand hätte, hätte ich;)). In 15 Jahren als Programmierer gab es jedoch nie ein echtes Liveproblem, das die Regel, die Sie beschrieben haben, ignorierte, noch hatte ich jemals einen Gewinn, wenn ich es befolgte. Hast du also ein Beispiel aus deiner Programmierung live, das wirklich jeden ermutigt nie, nie gegen konkrete Klassen zu programmieren? –

+0

@KaiHuppmann Aus Performance-Gründen ist es in Ordnung, konkrete Klassen zu deklarieren und zu verwenden (zB als lokale Variablen in einer Methode). Die öffentliche Schnittstelle einer Klasse sollte jedoch in Bezug auf Schnittstellen offen gelegt werden. Das hat mir gut gedient :) –

+0

@KaiHuppmann Nun, sie sind alle falsch :) – ZhongYu

1

Indem Sie es wie im ersten Beispiel tun, können Sie die Liste jeder Datenstruktur zuweisen, die die Schnittstelle List implementiert.

Dies fügt flexibility zu Ihrem Programm hinzu, da Sie die Implementierung problemlos ändern können.

2

Erste Wege wird Codierung genannt

Zweite eine Schnittstelle zur Implementierung genannt Codierung.

Der Vorteil mit dem zweiten ist, dass es Ihnen die Flexibilität gibt, die Implementierungsklasse später ohne Codeänderung zu ändern. Zum Beispiel verwenden Sie heute ArrayList, aber wenn Sie es morgen in LinkedList ändern möchten, dann ändern Sie einfach die Implmentationsklasse in Ihrer Listendefinition.

0

Liste ist eine Schnittstelle. ArrayList ist eine Klasse, die die List-Schnittstelle implementiert.

0

Der Unterschied ist, es verbirgt die spezifische Implementierung von Aufrufern von Methoden, die Liste zurückgeben. Dies ist im Allgemeinen eine gute Vorgehensweise - Wenn Sie List zurückgeben, haben Sie später die Freiheit, die zugrundeliegende Implementierung zu ändern, ohne sich Sorgen zu machen, dass sich ein Haufen anderen Codes ändert. Wenn Sie die Liste spezifische Dinge wie List.get(index) nicht brauchen könnte man sogar noch einen Schritt weiter gehen und einfach Collection<String> col = new ArrayList<String();

1

Die erste lassen Sie die konkrete Klasse (Arraylist) angeben zu ändern, wenn Sie später feststellen, dass eine andere Implementierung von Liste ist besser für Ihre Aufgabe geeignet. Sie müssten nur diese eine Zeile ändern, da die anderen Stellen, die arrList verwenden, alles erwarten, was List implementiert, nicht ein ArrayList.

Mit der zweiten Version, wenn Sie diese Änderung vornehmen entscheiden, müssen Sie jeden Ort ändern, die ein ArrayList.

erwartet Wie bereits erwähnt, diese an die Schnittstelle Codierung genannt wird.

0

Wenn Sie eine ArrayList erstellen möchten, ist nur die zweite korrekt.Die erste erstellt eine List, die von der ArrayList Klasse implementiert wird, aber sie sind in vielen Fällen nicht austauschbar. This question hat eine ziemlich gute Antwort.

+1

Es ist durchaus möglich, eine 'ArrayList' mit der ersten Option zu erstellen. – RaptorDotCpp

0

Entgegen der landläufigen Meinung, sage ich, dass wir das zweite Formular verwendet werden sollte

ArrayList<X> list = new ArrayList<>(); 

Diese Linie ist eine Implementierung Detail; wir sollten so genau wie möglich in unseren Implementierungsdetails sein.

Es ist nicht Teil einer öffentlichen API, die abstrahiert werden sollte; Argumente für "Code gegen Schnittstelle" gelten hier nicht.

0

kann ich sehen, dass viele Menschen die Schnittstelle empfiehlt, ich folgendes sagen würde:

  • Wenn Sie die Person denken verwenden muss Ihr Code wirklich die Details der Implementierung wissen Sie verwenden, Benutze die Betonklasse. Wenn Sie beispielsweise eine Hochleistungsbibliothek schreiben, deren Methoden eine bestimmte Implementierung (z. B. LinkedList) zurückgeben, die besondere Vorsicht bei der Verarbeitung erfordert).

  • In den meisten anderen Fällen, wenn Sie vermeiden können, zu viele Details zu veröffentlichen, verwenden Sie Schnittstellen.