Почему нет конструктора ArrayList (T [] t)? - PullRequest
16 голосов
/ 29 ноября 2010

Очень часто инициализировать список массивом объектов можно следующим образом:

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

Интересно, есть ли причина, по которой разработчики ArrayList не включают конструктор с массивом в качестве параметра, такэто может быть инициализировано так:

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

Может быть, это нарушает некоторые принципы, потокобезопасность или что-то еще?

Ответы [ 4 ]

11 голосов
/ 29 ноября 2010

Я не знаю, почему его нет в стандартной библиотеке, но класс Guava * Lists имеет newArrayList, что даже помогает при выводе типа:

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

(Вы можете импортировать Lists.newArrayList статически, если вы часто его используете.)

7 голосов
/ 29 ноября 2010

Вы можете использовать Google Guava Library (AKA Google Collections) для этого:

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

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

2 голосов
/ 29 ноября 2010

Кажется, причина в том, что ArrayList не реализует сам конструктор, а просто делегирует вызов конструктору суперкласса, то есть конструктору AbstractList.Существует много реализаций списков, включая LinkedList, у которых не должно быть конструктора, принимающего массив.

Я думаю, что отсутствие конструктора, принимающего массив, и наличие статического служебного метода в классе Arrays - пример хорошего дизайна и лучшего повторного использования кода.Это верно, что это заставляет нас писать немного более подробный код, но это цена.

Кстати, если вы используете статический import java.util.Arrays, вы можете затем позвонить asList() без упоминания массивов, поэтому код не является подробным.

0 голосов
/ 29 ноября 2010

java.util.Arrays внутренне использует свою собственную версию ArrayList class ...

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

Не знаю, почему он не включен в стандартный вызов конструктора ... но вы можете последовать примеруjava.util.Arrays и у вас есть собственная версия Arraylist.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...