Лучшая практика разработки API Java 7 - вернуть массив или вернуть коллекцию
Я знаю, что этот вопрос задан до того, как выйдет общий. Массив действительно немного выигрывает, если массив задает тип возвращаемого значения, он более безопасен для типов.
Но теперь, с последним JDK 7, каждый раз, когда я разрабатываю API этого типа:
public String[] getElements(String type)
vs
public List<String> getElements(String type)
Я всегда стараюсь думать о некоторых веских причинах, чтобы вернуть коллекцию через массив или по-другому. Какова наилучшая практика, когда дело касается выбора String [] или List в качестве возвращаемого типа API? Или это курсы для лошадей.
У меня нет особого случая, я больше ищу общий анализ плюсов и минусов.
Ответы
Ответ 1
Вот неполный список
Преимущества массива:
- Fast
- Относительно природы
- Вы точно знаете, что вы получаете (что такое тип) - так что вы точно знаете, как будет вести себя возвращенный объект.
Преимущества списка:
Ответ 2
Если вы пишете открытый API, ваши клиенты обычно предпочитают коллекции, потому что их легче манипулировать и интегрировать с остальной частью кодовой базы. С другой стороны, если вы ожидаете, что ваш общедоступный API будет использоваться в контексте с высокой чувствительностью к производительности, предпочтительным является необработанный массив.
Если вы пишете это для своего собственного использования, было бы лучше начать с типа коллекции и только переключиться на массив, если есть определенная проблема с производительностью, связанная с этим.
Тип элемента массива может быть определен во время выполнения через отражение, поэтому, если эта особенность важна для вас, это будет другой случай, чтобы предпочесть массив.
Ответ 3
Если у меня есть выбор, я бы выбрал коллекцию из-за добавленного поведения, которое я получаю для "свободного" в Java.
Внедрение в интерфейсы
Самое большое преимущество заключается в том, что если вы вернете API Collection (или даже List, Set и т.д.), вы можете легко изменить реализацию (например, ArrayList, LinkedList, HashSet и т.д.), не требуя изменения клиентов с помощью метода.
Добавление поведения
Класс Java Collections предоставляет множество оболочек, которые могут быть применены к коллекции, включая
- Синхронизация коллекции
- Создание коллекции неизменяемой
- Поиск, реверс и т.д.
Ответ 4
Когда вы публикуете публичный API, имеет смысл возвращать коллекцию, так как это облегчает жизнь клиенту, используя всевозможные доступные ему методы. Клиент всегда может вызывать toArray()
, если хочет получить представление массива для особых случаев.
Кроме того, интеграция с другими модулями становится проще, так как большинство ожиданий API ожидаются, поэтому они могут работать.
Ответ 5
В моей точке зрения это зависит от того, для чего будет использоваться возвращаемое значение.
Если возвращаемое значение будет итерировано и ничего больше, массив будет лучшим выбором, но если результат будет обработан, тогда перейдите к соответствующей коллекции.
Но будьте осторожны, потому что, например, List должен разрешать дубликаты, пока Set не должен, Stack должен быть LIFO, тогда как Queue должен быть FIFO, и обратите внимание на SHOULD, который я использую, потому что только реализация может определять реальное поведение.
В любом случае, это действительно зависит.