让我们考虑以下示例。
编写API,其中包含返回唯一对象集合的公共方法。
我认为编写该方法Set
的返回类型以向用户显示这些项是唯一的是很好的。
如果这些项目是唯一的并且是有序的,那么写一个返回类型LinkedHashSet
是一个正确的想法,或者最好是Collection
吗?
我知道那些独特且有分类的收藏品。我知道设置公共方法的返回类型类(TreeSet,SortedSet,LinkedHashSet)是个好主意。就oop而言。
答案 0 :(得分:8)
您可以返回SortedSet
- 这意味着这些项目已经过排序,并且是唯一的。
您还可以使用SetUniqueList
(来自commons-collection)并返回List
(在javadoc中指示元素是唯一的),或任何集合并返回Set
(并指示javadoc中的有序属性)
LinkedHashSet
保留了插入顺序,但由于您的对象可能正在执行插入操作,因此对客户端没有任何意义。
答案 1 :(得分:4)
如果您的项目是唯一的,那么我会返回一个Set。然后在Javadoc中包含保证项目按排序顺序的方法。
答案 2 :(得分:4)
我建议不要退回LinkedHashSet
(除非你有充分的理由)。如果您返回Set
,则可以根据需要更改Set
实施,例如HashSet
,TreeSet
等
在这种情况下,我认为您回复Set
的建议很好,因为它确实表明这些项目是唯一的。这也表明contains
通常会很快(O(1)或O(log n))。
另一方面,Collection
非常通用,但它告诉调用者它是一个普通的旧组,对排序或唯一性没有任何特殊限制。指定Set
意味着没有任何关于唯一性的混淆,并且您可以在任何可以使用Collection
的任何地方使用它。
答案 3 :(得分:2)
要回答您的问题,您应该问自己:“指定此方法返回的特征的最通用类型是什么?”
如果方法的特征是以某种方式返回一些唯一对象排序,那么代表它的最通用的标准类是{{1 }}
如果返回SortedSet
,那么该方法将提供有关它返回的实现的详细信息(即,TreeSet是具体类,而不是接口),这通常是您希望在OOP中避免的。 / p>
如果您返回TreeSet
,则表示您没有说明这些对象是唯一的,也没有说明它们是以某种方式排序的。
如果你返回Collection
,你不仅没有说明返回的集合是以某种方式排序的,而且你在OOP的抽象方面也失败了(这是一个具体的类,所以你泄漏了实现细节;总是尝试返回接口,除非你有充分的理由)。
答案 4 :(得分:1)
如果方法的契约的一部分,它的返回值为LinkedHashSet<...>
并且排序一致,我只会给返回类型Set<...>
一个方法。即便如此,我仍然有点担心这样做,除非也方法的合同的一部分,它的返回值是可修改的,否则LinkedHashSet<...>
也排除使用{{ 1}}。
在大多数情况下,我认为Collections.unmodifiableSet(...)
是一种更好的回归类型。或者,如果一致排序特别重要,那么您可以使用Set<...>
并切换到其中一个实现(例如SortedSet<...>
);仍然允许TreeSet<...>
。
答案 5 :(得分:0)
您希望明确它们是唯一的并且完全基于插入顺序进行排序,您可以返回LinkedHashSet
但是,Set
通常是更好的选择。