Почему нет конструктора ArrayList (T [] t)?
Очень часто инициализировать список массивом объектов таким образом:
Foo[] objs = ...;
ArrayList<Foo> list = new ArrayList<Foo>(Arrays.asList(objs));
Интересно, есть ли причина, по которой разработчики ArrayList не включали конструктор с массивом в качестве параметра, так что он мог быть инициализирован следующим образом:
ArrayList<Foo> list = new ArrayList<Foo>(objs);
Может быть, это нарушает некоторые принципы, безопасность потоков или что-то еще?
Ответы
Ответ 1
Я не знаю, почему это не в стандартной библиотеке, но Guava Lists
имеет newArrayList
, что даже помогает с типом вывода:
ArrayList<Foo> list = Lists.newArrayList(objs);
(Вы можете импортировать Lists.newArrayList
статически, если используете его много.)
Ответ 2
Вы можете использовать Google Guava Library (AKA Google Collections) для этого:
String[] ary = {"a", "b"};
List<String> l = Lists.newArrayList(ary);
http://code.google.com/p/guava-libraries/
Ответ 3
Похоже, причина, по которой ArrayList не реализует никакого конструктора, а просто делегирует вызов суперклассическому конструктору, т.е. конструктору AbstractList. Существует множество реализаций списков, включая LinkedList, которые не должны иметь конструктор, который принимает массив.
Я думаю, что отсутствие конструктора, который принимает массив и наличие статического метода утилиты в классах массивов, является примером хорошего дизайна и лучшего повторного использования кода. Это правильно, что это заставляет нас писать немного более подробный код, но это цена.
BTW, если вы используете статический import java.util.Arrays
, вы можете вызвать asList()
без упоминания массивов, поэтому код не должен быть подробным.
Ответ 4
java.util.Arrays
внутренне использует свою собственную версию класса ArrayList
...
private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable
{
...
}
Не знаю, почему он не включен в стандартный вызов конструктора... но вы можете следовать примеру java.util.Arrays
и иметь свою собственную версию Arraylist.