2010-02-03 13 views
7

Ich fragte mich, welche Art der Initialisierung einer Liste ist besser?Welche Art von Liste initialisieren ist besser


public class Main { 
    private final List<String> l = new ArrayList<String>(); 

    { 
     l.add("a"); 
     l.add("b"); 
     l.add("c"); 
    } 
} 

public class Main { 

    private final List<String> l = new ArrayList<String>() {{ 
     l.add("a"); 
     l.add("b"); 
     l.add("c");   
    }}; 
} 

+2

Letzteres funktioniert, aber Sie müssen nicht 'l.-prefix in body verwenden. Plain 'add (" a ");' ist genug. – Ahe

Antwort

2

Keine, weil niemand die Liste unveränderlich macht. Ich denke du willst es unveränderlich machen, wenn du final verwendest. Wenn das nicht der Fall ist, entschuldige ich mich für meine Annahme.

Wenn ich richtigerweise davon ausgehe, sollten Sie einen Blick in Collections.unmodifiableList() werfen. Und letzteres wird nützlich sein,

private final List<String> l = Collections.unmodifiableList(new ArrayList<String>() {{ 
     add("a"); 
     add("b"); 
     add("c");   
}}); 

Ansonsten, dfa ist richtig in der ersten vorschlagen.

Eine andere Art und Weise kann das sein,

private final List<String> l = Collections.unmodifiableList(Arrays.asList("a", 
            "b", "c")); 
+0

Das zweite Beispiel ist endgültig, also kann 'l' innerhalb des anonymen Blocks zugegriffen werden, den ich annehme. Das ist irreführend, weil du es nicht brauchst und du könntest einfach 'add (" a ")' anstelle von 'l.add (" a ") schreiben, aber ich nehme an, das ist eher der Grund als die Pseudo-Unveränderlichkeit. – cletus

6

Ich ziehe es mit statischen Factory-Methoden der nächsten Art:

public final class CollectionUtils { 
    private CollectionUtils() { 
    } 

    public static <T> List<T> list(T... data) { 
     return Arrays.asList(data); 
    } 

    public static <T> ArrayList<T> newArrayList() { 
     return new ArrayList<T>(); 
    } 

    public static <T> ArrayList<T> newArrayList(T... data) { 
     return new ArrayList<T>(list(data)); 
    } 
} 

So können Sie sie in Ihrem Code in der nächsten Art und Weise verwenden:

import static CollectionUtils.list; 
import static CollectionUtils.newArrayList; 

public class Main { 
    private final List<String> l1 = list("a", "b", "c"); 
    private final List<String> l2 = newArrayList("a", "b", "c"); 
} 

So erhalten Sie relativ kompakte Möglichkeit zum Erstellen und Auffüllen von Listen und müssen nicht generische de duplizieren Klarstellungen. Beachten Sie, dass die Methode list nur eine Listenansicht des Arrays erstellt. Sie können später keine Elemente hinzufügen (oder entfernen). Unterdessen newArrayList erzeugt übliches ArrayList Objekt.

Wie Joachim Sauer erwähnt, diese Hilfsmethoden (und viele andere nützliche Dinge) in Google Collections Bibliothek zu finden (das ist jetzt ein Teil von Guava Projekt).

+1

Ich muss dieses eine wählen, da dies der Ansatz ist, den ich bei mehreren Projekten verwendet habe. Aber ich glaube, du hast die statischen Importe im 'Main'-Beispiel vergessen :) – Christoffer

+0

IDE fügt sie normalerweise für mich hinzu) – Rorick

+2

Google Collections macht das (und viele andere Dinge) für dich. Diese Factory-Methoden befinden sich beispielsweise in der Klasse "Lists". –

Verwandte Themen