LinkedHashSet как возвращаемый тип открытого метода API - PullRequest
3 голосов
/ 16 декабря 2011

Давайте рассмотрим следующий пример.

Написание API, который имеет открытый метод, который возвращает коллекцию уникальных объектов.Я считаю, что хорошо написать тип возврата этого метода Set, чтобы показать пользователю, что элементы уникальны.В случае, если эти элементы уникальны и упорядочены, правильно написать тип возврата LinkedHashSet или хорошо быть Collection?

Я знаю коллекции, которые уникальны и отсортированы.Что бы знать, это хорошая идея установить класс возвращаемого типа публичного метода (TreeSet, SortedSet, LinkedHashSet).В пересчете на уп.

Ответы [ 6 ]

8 голосов
/ 16 декабря 2011

Вы можете вернуть SortedSet - это означает, что элементы отсортированы и являются уникальными.

Вы также можете использовать SetUniqueList (из commons-collection) и возвращать List (указывая в javadoc, что элементы являются уникальными), или любой набор и возвращать Set (и указывать упорядоченное свойство в javadoc)

LinkedHashSet сохраняет порядок вставки, но поскольку ваш объект, вероятно, выполняет вставки, это ничего не значит для клиента.

4 голосов
/ 16 декабря 2011

Я бы рекомендовал не возвращать LinkedHashSet (если у вас нет для этого очень веских оснований).Если вы вернете Set, вы можете изменить реализацию Set по своему усмотрению, например, HashSet, TreeSet и т. Д.

. В этом случае, я думаю, что ваше предложение вернуть Set являетсяхороший, поскольку это указывает на то, что предметы являются уникальными.Это также означает, что contains обычно будет быстрым (O (1) или O (log n)).

С другой стороны, Collection является очень общим, но все, что он говорит вызывающей стороне, этоэто простая старая группа вещей без каких-либо особых ограничений на порядок или уникальность.Указание Set означает, что нет никакой путаницы в уникальности, и вы можете использовать его везде, где Collection можно использовать в любом случае.

4 голосов
/ 16 декабря 2011

Если вы уникальные предметы, я бы вернул набор.Затем включите в Javadoc метод, который гарантирует, что элементы будут в отсортированном порядке.

2 голосов
/ 16 декабря 2011

Чтобы ответить на ваш вопрос, вы должны спросить себя: «Какой самый общий тип указывает характеристики того, что возвращает этот метод?»

Если характеристикой метода является возвращение нескольких уникальных объектов, отсортированных , то наиболее общий стандартный класс, представляющий это SortedSet.

Если вы возвращаете TreeSet, то метод дает подробные сведения о реализации того, что он возвращает (т. Е. TreeSet - это конкретный класс, а не интерфейс), чего вам часто следует избегать в ООП.

Если вы возвращаете Collection, вы не утверждаете, что объекты уникальны или что они каким-то образом отсортированы.

Если вы возвращаете LinkedHashSet, вы не только не в состоянии утверждать, что возвращенная коллекция каким-то образом отсортирована, но и в абстрагированном аспекте ООП (это конкретный класс, поэтому вы пропускаете детали реализации; всегда попытайтесь вернуть интерфейсы, если у вас нет веских причин).

1 голос
/ 16 декабря 2011

Я бы дал методу тип возврата LinkedHashSet<...>, только если он является частью контракта метода, что его возвращаемое значение равно Set<...> с последовательным порядком.И даже тогда я бы немного опасался делать это, если только также не является частью договора метода о том, что его возвращаемое значение является изменяемым, поскольку в противном случае LinkedHashSet<...> также исключает использование Collections.unmodifiableSet(...).

В большинстве случаев я считаю Set<...> лучшим типом возврата.В качестве альтернативы, если согласованный порядок особенно важен, вы можете использовать SortedSet<...> и переключиться на одну из реализаций этого (например, TreeSet<...>);это все еще позволяет Collections.unmodifiableSortedSet(...).

0 голосов
/ 16 декабря 2011

Если вы хотите дать понять, что они уникальны и упорядочены исключительно в соответствии с порядком вставки, вы можете вернуть LinkedHashSet Однако, Set обычно лучший выбор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...