Подтвердить что ты не робот

Возвращать ArrayList или List?

Я создаю библиотеку, которая будет использоваться людьми, но почему мой метод должен возвращать Список вместо ArrayList?

Потому что, если пользователь знает, что настоящий тип является ArrayList, он будет использовать accessor [] в цикле вместо итератора, но если он не знает, что он будет использовать итератор.

Тот же вопрос для LinkedList, если тип возврата - это List, он не сможет использовать правильный аксессор.

Я прав?

4b9b3361

Ответ 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.