2010-09-22 9 views
15

Ich bin auf der Suche nach einer kompakten Syntax zum Instanziieren einer Sammlung und Hinzufügen einiger Elemente. Ich verwende derzeit diese Syntax:Kompakte Syntax zum Instanziieren einer initialisierenden Sammlung

Collection<String> collection = 
    new ArrayList<String>(Arrays.asList(new String[] { "1", "2", "3" })); 

Ich glaube ich zu erinnern, dass es eine kompaktere Art und Weise, dies zu tun, die eine anonyme Unterklasse von ArrayList verwendet, dann fügt die Elemente in der Unterklasse Konstruktor. Ich kann mich jedoch nicht an die genaue Syntax erinnern.

Antwort

2

war, dass

Collection<String> collection = new ArrayList<String>() {{ 
    add("foo"); 
    add("bar"); 
}}; 

bekannt auch als Doppelbügel Initialisierung Vielleicht.

8

Ich denke, Sie über

collection = new ArrayList<String>() { // anonymous subclass 
    { // anonymous initializer 
     add("1"); 
     add("2"); 
     add("3"); 
    } 
} 

die, ein comapcted, gibt

collection = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }} 

FUGLY, denken, gelinde gesagt. Es gibt jedoch eine Variante der Methode "Arrays.asList": Arrays.asList(T...a), die Kompabilität und Lesbarkeit bietet. Als Beispiel gibt es die folgende Codezeile:

collection = new ArrayList<String>(Arrays.asList("1", "2", "3")); // yep, this one is the shorter 

Und bemerken Sie nicht eine anonyme Unterklasse von Arraylist von zweifelhafter Verwendung erstellen.

0

Vielleicht ist es nur mich, aber ich nicht den Punkt zu verkomplizieren die Dinge sehen, die ausschließlich im Rahmen der kürzeren/schnelleren Code zu schreiben. Angesichts der Wahl, etwas weniger Codezeilen zu schreiben und das Debuggen/Überarbeiten viel einfacher zu machen, bin ich mir ziemlich sicher, dass ich die zweite Option wählen würde.

Also, es sei denn, es gibt einen besonderen Grund, um dies kurz zu halten, würde ich sagen, bleiben Sie bei Ockham Rasierer und eine Reihe von Lösungen für ein Problem, gehen Sie mit der einfachsten. Auf diese Weise, wenn etwas schief geht (was Murphys Gesetz eindeutig vorschreibt), wird es viel einfacher sein, es zu verfolgen. :)

1

Sie könnten eine Nutzenfunktion erstellen:

@SafeVarargs 
public static <T> List<T> listOf(T ... values) { 
    return new ArrayList<T>(Arrays.asList(values)); 
} 

So könnte man es gerne nennen:

collection = MyUtils.listOf("1", "2", "3"); 

Auf diese Weise können Sie ganz einfach eine Liste füllen kann und es immer noch wandelbar halten .

Verwandte Themen