LinkedHashSet作为API公共方法的返回类型

时间:2011-12-16 13:21:13

标签: java oop collections

让我们考虑以下示例。

编写API,其中包含返回唯一对象集合的公共方法。 我认为编写该方法Set的返回类型以向用户显示这些项是唯一的是很好的。 如果这些项目是唯一的并且是有序的,那么写一个返回类型LinkedHashSet是一个正确的想法,或者最好是Collection吗?

我知道那些独特且有分类的收藏品。我知道设置公共方法的返回类型类(TreeSet,SortedSet,LinkedHashSet)是个好主意。就oop而言。

6 个答案:

答案 0 :(得分:8)

您可以返回SortedSet - 这意味着这些项目已经过排序,并且是唯一的。

您还可以使用SetUniqueList(来自commons-collection)并返回List(在javadoc中指示元素是唯一的),或任何集合并返回Set(并指示javadoc中的有序属性)

LinkedHashSet保留了插入顺序,但由于您的对象可能正在执行插入操作,因此对客户端没有任何意义。

答案 1 :(得分:4)

如果您的项目是唯一的,那么我会返回一个Set。然后在Javadoc中包含保证项目按排序顺序的方法。

答案 2 :(得分:4)

我建议不要退回LinkedHashSet(除非你有充分的理由)。如果您返回Set,则可以根据需要更改Set实施,例如HashSetTreeSet

在这种情况下,我认为您回复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通常是更好的选择。