2010-11-29 19 views
15

Es muy común a la lista de inicializar por matriz de objetos de tal manera:¿Por qué no hay un constructor ArrayList (T [] t)?

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

Me pregunto, ¿hay alguna razón por la desiners de ArrayList no incluían constructor array como parámetro, por lo que podría ser Inicializado de esa manera:

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

¿Puede ser que viole algunos principios, seguridad de hilos o algo más?

+0

No puedo decirle cuántas veces he trabajado mucho con ArrayList y me he preguntado por qué esta característica aparentemente * obvia * no es parte de 'ArrayList' – mmcrae

Respuesta

11

No sé por qué no está en la biblioteca estándar, pero Guava 's Lists clase tiene newArrayList la que incluso ayuda con la inferencia de tipos:

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

(Es posible que desee importar Lists.newArrayList estáticamente si utiliza es mucho)

7

puede utilizar Google guayaba Biblioteca (también conocido como Google Colecciones) para esto:.

String[] ary = {"a", "b"}; 
List<String> l = Lists.newArrayList(ary); 

http://code.google.com/p/guava-libraries/

2

Parece que la razón por la que ArrayList no implementa ningún constructor en sí mismo sino que simplemente delega la llamada al constructor de superclase, es decir, el constructor de AbstractList. Hay muchas implementaciones de lista, incluida LinkedList, que no debería tener un constructor que acepte la matriz.

Creo que la ausencia de un constructor que acepte la matriz y la presencia del método de utilidad estática en las matrices de la clase es un ejemplo de buen diseño y una mejor reutilización del código. Es correcto que nos haga escribir un código un poco más detallado, pero este es el precio.

BTW si está utilizando estática import java.util.Arrays puede llamar al asList() sin mencionar Arrays, por lo que el código no es detallado.

0

java.util.Arrays internamente utiliza su propia versión de la clase ... ArrayList

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

Ni idea de por qué no se incluye como una llamada al constructor estándar ... pero se puede seguir el ejemplo de java.util.Arrays y tener su propia versión de Arraylist.

Cuestiones relacionadas