2010-09-22 11 views
15

Je recherche une syntaxe compacte pour instancier une collection et lui ajouter quelques éléments. J'utilise actuellement cette syntaxe:Syntaxe compacte pour l'instanciation d'une collection d'initialisation

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

me semble me rappeler qu'il ya une façon plus compacte de le faire qui utilise une sous-classe anonyme de ArrayList, ajoute ensuite les éléments de la sous-classe constructeur. Cependant, je n'arrive pas à me souvenir de la syntaxe exacte.

Répondre

2

Peut-être était

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

Aussi connu comme l'initialisation double support.

8

Je suppose que vous pensez à

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

qui, un comapcted, donne

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

FUGLY, pour le moins. Cependant, il existe une variante de la méthode Arrays.asList: Arrays.asList(T...a) qui fournit comapcity et lisibilité. À titre d'exemple, il donne la ligne de code suivante:

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

Et remarquez que vous ne créez pas une sous-classe anonyme de ArrayList d'utilisation douteuse.

0

Peut-être juste moi, mais je ne vois pas le point de compliquer les choses, purement à la poursuite de l'écriture de code plus court/plus rapide. Étant donné le choix de taper légèrement moins de lignes de code et le débogage/révision beaucoup plus facile, je suis sûr que je choisirais la deuxième option. Donc, à moins qu'il y ait une raison particulière de pousser pour garder cela court, je dirais coller au rasoir d'Ockham, et donné un certain nombre de solutions à un problème, aller avec le plus simple. De cette façon, quand quelque chose ne va pas (ce que la loi de Murphy dicte clairement), vous aurez beaucoup plus de temps pour le suivre. :)

1

Vous pouvez créer une fonction utilitaire:

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

Ainsi, vous pouvez l'appeler comme:

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

De cette façon, vous pouvez remplir une liste très facilement, et garder encore mutable .