2015-04-19 6 views
6

Kann jemand erklären, was ist der Unterschied in der folgenden Deklaration von ArrayList zu speichern String.Best Practice zum Deklarieren ArrayList oder Auflistung Implementierungsklassen

List type1 = new ArrayList(); 
List type2 = new ArrayList<String>(); 
List<String> type3 = new ArrayList<String>(); 
ArrayList<String> type4 = new ArrayList<String>(); 
List<String> type5 = null; 
ArrayList<String> type6 = null; 

so die von der obigen Erklärung ist beste Praxis ein ArrayList von Streich- und warum zu erklären?

+0

Siehe auch [* "Was ist der Unterschied zwischen diesen Arten der Initialisierung einer HashMap?" *] (Http://stackoverflow.com/q/26565606/2891664) – Radiodef

Antwort

4

Die ersten zwei verwenden rohe Typen. Das bedeutet, dass Ihre Liste überhaupt nicht typsicher ist. Mit dem Compiler können Sie Ganzzahlen speichern, auch wenn Sie eine Liste mit Strings haben möchten. Der Compiler gibt eine Warnung aus, die Sie nicht ignorieren sollten.

Die dritte ist richtig. Es teilt dem Compiler mit, dass Sie eine Liste von Zeichenfolgen verwenden möchten und dass die von Ihnen ausgewählte spezifische Implementierung ArrayList ist. Wenn Sie Ihre Meinung später ändern und eine LinkedList verwenden möchten, ist diese Codezeile die einzige, die Sie ändern müssen.

Die vierte sagt dem Compiler, dass Ihr Programm nicht nur eine Liste benötigt. Es benötigt diese Liste als ArrayList.Dies ist in Ordnung, wenn Ihr Code tatsächlich Methoden aufrufen muss, die für ArrayList spezifisch sind und nicht in der List-Schnittstelle vorhanden sind. Aber in 99,9% der Fälle ist das nicht der Fall und Sie sollten den dritten bevorzugen.

Die beiden letzten deklarieren eine Variable und initialisieren sie auf null, anstatt eine Liste zu erstellen. Das ist ein Designgeruch. Bevor Sie die Liste verwenden, müssen Sie sicherstellen, dass sie nicht null ist. Es ist viel sicherer, es sofort mit einer gültigen Liste zu initialisieren.

5
  • List type1 = new ArrayList();
  • List type2 = new ArrayList<String>();

    Sie haben eine raw typeArrayList und List, sollten Sie sie nicht benutzen (obwohl es legal Code ist):

    ... Der Begriff „ungeprüft "bedeutet, dass der Compiler nicht genügend Typinformationen hat, um alle Typprüfungen durchzuführen, die notwendig sind, um die Typensicherheit

    zu gewährleisten
  • List<String> type3 = new ArrayList<String>();

    Dies ist sicher, und da Java 7 es könnte den Diamant-Operator verwenden und neu geschrieben als:

    List<String> type3 = new ArrayList<>();

    Es ist die beste, da es Programm an eine Schnittstelle Das bedeutet, dass Sie type3 in jede andere Klasse ändern können, die List implementiert.

  • ArrayList<String> type4 = new ArrayList<String>();

    Dieser ist ein bestimmtes Objekt ist, kann man nie die Art von type4 auf etwas anderes statt ArrayList ändern.

Die letzten beide nicht mit dem Rest verglichen werden kann, sind Sie ihnen einfach einen Standardwert geben, manchmal sind Sie gezwungen, manchmal kann man diese Initialisierung überspringt.

1

Entweder List<String> type3 = new ArrayList<String>(); oder List<String> type5 = null;. statt Implementierungstypen

Es ist immer besser, nicht roh Typen wie List und ArrayList, zu verwenden und es ist flexibler Variablen von Schnittstellentypen zu deklarieren.

Zur Frage, ob Sie die Variable initialisiert die List später auf null und instanziiert (oder auf die Variable das Ergebnis einer Methode zuweisen, die eine List Instanz zurückgibt), oder es zu instanziiert, wenn Sie es erklären, sind beide Optionen Meiner Meinung nach gleichwertig.

2

type1 und type2 sind Raw Types und sollten vermieden werden.

type3 und type4 sind gut (aber nicht IMO die beste, und ich werde darauf zurückkommen) - ich würde type3-type4 bevorzugen, weil sie den Schnittstellentyp verwendet (und Sie sollten an die Schnittstelle programmieren).Sie könnten zum Beispiel eine Arrays.asList("a","b") mit type3 verwenden.

type5 und type6 sind ähnlich type3 und type4 aber ich würde Ihnen empfehlen, zu null Initialisierung zu vermeiden.

Endlich, mit Java 7+ würde ich den Diamant-Operator empfehlen. Zum Beispiel

List<String> type7 = new ArrayList<>(); 
2

Im Allgemeinen ist es empfehlenswert, auf der linken Seite den dest spezifischen Typen zu halten, die Sie benötigen, um Ihre Funktionalität auszuführen. Sie sollten jedoch parametrisierbare Typen immer parametrisieren und unformatierte Typen vermeiden. So sollten Sie verwenden:

List<String> type3 = new ArrayList<String>(); 

Beachten Sie, dass wie von Java 7, können Sie auch den Typ auf der rechten Seite auslassen:

List<String> type3 = new ArrayList<>(); 

Später, sollten Sie stattdessen einen LinkedList verwenden möchten, Sie können die Codezeile, in der Sie die Liste erstellen, einfach aktualisieren, ohne alle Verweise darauf ändern zu müssen.

2
  • 1 und 2 sind Rohtypdeklarationen. Sie können einen beliebigen Objekttyp zu dieser Liste hinzufügen, aber Sie können die Typensicherheit zur Kompilierzeit nicht garantieren.

    Deklarieren einer Liste auf diese Weise is generally frowned upon, da es ein sehr einfacher Fehler sein kann, versehentlich ein Objekt in die Liste zu legen, die Sie nicht haben sollten. Der wirkliche Nachteil hier ist, dass dieser Fehler sich nicht manifestieren wird Laufzeit, während die Verwendung eines Typparameters diesen Fehler manifestieren sich bei Kompilierzeit, die viel einfacher zu behandeln ist.

  • 3 ist der bevorzugte Ansatz zum Deklarieren einer Liste (oder Sammlung von jeder Art), wie Sie bound to the interface anstelle der konkreten Implementierung sind. Es enthält auch die Typgrenzen, die die Sicherheit beim Kompilieren garantieren.

  • 4 ist eine Deklaration zum konkreten Typ ArrayList. Wenn Sie den konkreten Typ benötigen, dann ist das in Ordnung, aber es gibt verschwindend wenige Fälle, in denen Sie tun.

  • 5 und 6 sind Wiederholungen von 3 bzw. 4; Der Unterschied ist, dass sie beide auf null initialisiert sind.

Verwandte Themen