Возвращать ArrayList или List?
Я создаю библиотеку, которая будет использоваться людьми, но почему мой метод должен возвращать Список вместо ArrayList?
Потому что, если пользователь знает, что настоящий тип является ArrayList, он будет использовать accessor [] в цикле вместо итератора, но если он не знает, что он будет использовать итератор.
Тот же вопрос для LinkedList, если тип возврата - это List, он не сможет использовать правильный аксессор.
Я прав?
Ответы
Ответ 1
Возврат Список позволит пользователям вашей библиотеки использовать все, что реализует интерфейс Список, при использовании ArrayList будет принудительно их использовать ArrayList.
Если в будущем вы, как создатель библиотеки, решите изменить внутреннюю реализацию, эти изменения будут скрыты от конечного пользователя общим интерфейсом к вашей библиотеке.
Ответ 2
Потому что пользователи вашей библиотеки никогда не должны знать, что вы используете ArrayList внутри.
Например, скажем, вы возвращаете ArrayList, и многие люди начали использовать вашу библиотеку. Теперь, если вы вдруг поймете, что LinkedList лучше подходит для вашей цели, тогда вы нарушаете совместимость для всех людей, которые в настоящее время используют ваш код.
Вот почему всегда лучше кодировать интерфейс, а не реализацию, и тем более, когда вы пишете код, специально предназначенный для повторного использования. Интерфейс (список в этом случае) действует как контракт между вашим кодом и кодом клиента. Он сообщает им, что делает ваш код (интерфейс), не сообщая им, как он это делает (не подвергая реализации).
Ответ 3
Если возможно, верните интерфейс (или, если возможно, суперкласс?). Таким образом, метод может иметь более широкое применение, если его можно переопределить. Это может помешать некоторым классам-методам быть доступными на возвращенном объекте, но нет ничего, что помешало бы программисту, берущему данные List
и копируя его в любой Collection
, который они предпочитают использовать.
List myList = new MyLibrary().getList();
ArrayList myArrayList = new ArrayList(myList);
LinkedList myLinkedList = new LinkedList(myList);
Ответ 4
Поскольку ваш пользователь может сделать из вашего списка либо ArrayList
, либо LinkedList
, вы оставите ему выбор. Он называется Программирование на интерфейс. Вы должны предоставить пользователям вашего API столько свободы, сколько сможете, и этот метод является одним из способов его достижения.
Ответ 5
Им не нужно использовать итератор. Интерфейс List поддерживает get(int index)
как метод. Если вам нужна гибкость, чтобы изменить базовый контейнер на все, что поддерживает интерфейс списка, используйте List
. Если для возвращаемого результата требуются специальные методы ArrayList
, используйте ArrayList
.
Ответ 6
1. Его концепция Interface Polymorphism
.
2. Лучше иметь List<My_Obj> arr = new ArrayList<My_Obj>;
3. Предположим, вы хотите использовать LinkedList вместо ArrayList как somepoint, тогда вы не хотите нужно беспокоиться, как это сделать.
Ответ 7
Если вы возвращаете List, то пользователи вашей библиотеки могут использовать все, что реализует интерфейс List. Это может быть список массивов или связанный список.
Ответ 8
Я обычно выбираю наиболее общий тип. В этом случае вы можете вернуть тип, который более общий, чем List, например Collection
или Iterable
.
Вернув Iterable, компилятор не позволит вызывающему коду пытаться добавить элементы в ваш список. Это намного сильнее, чем полагаться на Collections.unmodifiableList()
для отказа во время выполнения.
Использование более общих типов также дает вам больше возможностей для маневра в будущем. Возможно, ваш метод будет загружать ваши данные из источника потоковой передачи, а не из источника в памяти: тогда Iterable становится намного более подходящим, чем List.