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

Лучшая практика разработки API Java 7 - вернуть массив или вернуть коллекцию

Я знаю, что этот вопрос задан до того, как выйдет общий. Массив действительно немного выигрывает, если массив задает тип возвращаемого значения, он более безопасен для типов.

Но теперь, с последним JDK 7, каждый раз, когда я разрабатываю API этого типа:

public String[] getElements(String type)
vs
public List<String> getElements(String type)

Я всегда стараюсь думать о некоторых веских причинах, чтобы вернуть коллекцию через массив или по-другому. Какова наилучшая практика, когда дело касается выбора String [] или List в качестве возвращаемого типа API? Или это курсы для лошадей.

У меня нет особого случая, я больше ищу общий анализ плюсов и минусов.

4b9b3361

Ответ 1

Вот неполный список

Преимущества массива:

  • Fast
  • Относительно природы
  • Вы точно знаете, что вы получаете (что такое тип) - так что вы точно знаете, как будет вести себя возвращенный объект.

Преимущества списка:

  • Поведение изменяется в зависимости от возвращаемого фактического типа (например, может быть изменчивым или неизменным в зависимости от фактического типа)
  • Лучший дизайн hirerchy.
  • (В зависимости от фактического типа) может быть динамический размер
  • Более интуитивно понятный hashCode(), equals() - который может иметь решающее значение, если вы подаете хэш-сбор в качестве ключа.
  • Тип безопасности:

    String[] arr1 = new String[5]; 
    Object[] arr2 = arr1;
    arr2[0] = new Object(); //run time error :(
    List<String> list1 = new LinkedList<String>();
    List<Object> list2 = list1; //compilation error :)
    

Ответ 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, который я использую, потому что только реализация может определять реальное поведение.

В любом случае, это действительно зависит.