Почему нет конструктора 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.