2010-11-29 19 views
15

Il est très utile d'initialiser la liste par tableau d'objets de telle manière:Pourquoi il n'existe aucun constructeur ArrayList (T [] t)?

Foo[] objs = ...; 
ArrayList<Foo> list = new ArrayList<Foo>(Arrays.asList(objs)); 

Je me demande, est-il une raison pour laquelle desiners de ArrayList ne comprennent pas constructeur avec tableau en tant que paramètre, de sorte qu'il pourrait être initialisé comme ça:

ArrayList<Foo> list = new ArrayList<Foo>(objs); 

Peut-il enfreindre certains principes, la sécurité des threads ou autre chose?

+0

Je ne peux pas vous dire combien de fois j'ai travaillé énormément avec ArrayList et je me suis demandé pourquoi cette fonctionnalité apparemment * évidente * ne fait pas partie de 'ArrayList' – mmcrae

Répondre

11

Je ne sais pas pourquoi il est pas dans la bibliothèque standard, mais Guava « a la classe de ListsnewArrayList qui aide même avec l'inférence de type:

ArrayList<Foo> list = Lists.newArrayList(objs); 

(Vous voudrez peut-être importer Lists.newArrayList statiquement si vous utilisez il a beaucoup)

2

Il semble que la raison pour laquelle ArrayList n'implémente aucun constructeur lui-même, mais qu'il délègue simplement l'appel au constructeur super classe, c'est-à-dire le constructeur de AbstractList. Il y a beaucoup d'implémentations de liste incluant LinkedList qui ne devrait pas avoir de constructeur qui accepte le tableau.

Je pense que l'absence de constructeur qui accepte le tableau et la présence d'une méthode d'utilité statique dans les tableaux de classes est un exemple de bonne conception et de meilleure réutilisation du code. C'est vrai que cela nous oblige à écrire un code un peu plus verbeux, mais c'est le prix.

BTW si vous utilisez import java.util.Arrays statique, vous pouvez ensuite appeler asList() sans mentionner les tableaux, de sorte que le code ne soit pas verbeux.

0

java.util.Arrays utilise en interne sa propre version de classe ArrayList ...

private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable 
{ 
... 
} 

Aucune idée pourquoi il ne figure pas comme un appel constructeur ... norme mais vous pouvez suivre l'exemple de java.util.Arrays et avoir votre propre version d'Arraylist.