По моему мнению, использование Collection
в противоположность более конкретному интерфейсу, например List
или Set
, должно быть сделано намеренно. Вы будете использовать интерфейс Collection
для всех случаев, когда более конкретный интерфейс расширяет интерфейс Collection
, то есть для истинных коллекций. Но вы не можете сделать то же самое для других интерфейсов, таких как Map
, которые представляют сопоставления, а не коллекции. Это означало бы, что над вашими знаками EJB-интерфейса нужно очень внимательно относиться.
Как указывалось в другом ответе Сюаня, если вы намереваетесь вернуть упорядоченную коллекцию, тогда вы должны использовать List
. Вы можете задокументировать это поведение вашего интерфейса, но в этом нет смысла; подпись метода должна передать это. Также обратите внимание, что List
s может содержать дубликаты, поэтому, если вы намереваетесь вернуть коллекцию без дубликатов, имеет больше смысла возвращать Set
вместо List
или Collection
. Чтобы переформулировать мое мнение, коллекция, возвращаемая методом EJB, должна максимально точно отражать свойства коллекции, не ссылаясь на конкретный тип; попытка использовать документацию для передачи этого может не дать желаемых результатов во время разработки клиентов EJB.
Что касается использования массивов, я бы рекомендовал избегать их, особенно массивов типа Object[]
. Их легко использовать и преобразовывать в слабо типизированные объекты передачи данных, что требует обширной документации о том, как должен обрабатываться каждый элемент массива. Тот же совет относится и к коллекциям, но большинство людей склонны злоупотреблять массивами вместо коллекций, или, по крайней мере, это было моим наблюдением.
Последнее замечание приводит к использованию дженериков в коллекциях. Если ваш контейнер (и косвенно версия спецификации EJB) позволяет вам использовать обобщенные интерфейсы для ваших методов, тогда используйте их для дополнительной безопасности типов. В конце концов, заставить вашего клиента обрабатывать List<DomainObject>
- лучшее проектное решение, чем позволить клиенту обрабатывать List
или List<Object>
. Я хотел бы еще раз подчеркнуть аспект поддержки контейнеров, поскольку интерфейсы EJB 2.x не поддерживают обобщенные элементы (это было моим наблюдением), в то время как EJB 3.x поддерживает обобщенные элементы (но контейнер может подавиться при развертывании или во время выполнения) и будет требовать, чтобы ваши локальные и удаленные интерфейсы кодировались определенным образом; например, WebLogic 10.3.x требует, чтобы вы указали универсальные шаблоны в суперинтерфейсе, который расширен как локальный / удаленный интерфейс.