无法确定返回SortedSet的方法的返回类型

时间:2010-05-21 22:00:55

标签: java naming

我应该创建一个应该是值间隔容器的类(比如数学)。我已经决定在内部使用SortedSet

我应该实现的一个方法是“获取包含区间中所有元素的有序集合”的方法。

class Interval {
    private SortedSet sortedSet = new something();

    ...

    <<method that should return an ordered set of values>>
}

我的问题在于方法的返回类型和名称应该是什么。出现了几个假设:

  1. SortedSet getSortedElements();我在内部使用SortedSet,所以我应该返回该类型。我应该在方法名称中声明意图。
  2. SortedSet getElements();我在内部使用的是SortedSet,但是在方法名称中没有任何意义(我没有看到这一点中的重点)。
  3. Set getElements();我应该尝试始终返回最基本的类型,因此我返回一个Set。通过合同和方法的定义,人们已经知道所有元素都是有序的。
  4. Set getSortedElements();对于方法返回类型,与上面相同。关于方法名称,您清楚地说明了此方法将返回的内容:一组已排序的元素。
  5. 我倾向于使用4.,但其他人也似乎没问题。有明显的赢家吗?为什么呢?

3 个答案:

答案 0 :(得分:4)

SortedSet是与合同的接口,元素已排序。它还公开了Set中没有的一些方法(例如first())。如果你应该返回一个遵守该契约的对象(例如,在iterator()上返回有序值),那么你应该返回一个Sorted Set。如果没有,您应该返回Set(或Collection)。

根据您希望如何使用结果,找出要返回的内容。想想“获得一个包含区间中所有元素的有序集合”意味着首先,然后担心实现。

顺便提一下代码

private SortedSet sortedSet = new SortedSet();

是非法的,因为SortedSet是一个接口。由于这是作业,我将留给你找出为什么这是一个问题。

答案 1 :(得分:1)

我认为返回Set是可维护性的正确方法 - 但我不喜欢任何方法名称。为什么不是更具描述性的东西:

Set getIntervalValues();

或其中的东西。

答案 2 :(得分:0)

如果该方法应该返回一个SortedSet,那应该是该方法的返回类型。调用者可以将结果分配给SortedSet或Set,具体取决于他们是否关心排序。 如果您的方法javadoc或名称暗示您正在返回已排序的集合,但您的方法返回类型仅为Set,那就像告诉您的管道工您将为他的服务支付100美元,但随后在合同中写下您将付给他&#34;至少50美元&#34;。

返回SortedSet
1)你承诺你的客户,你将返回一个排序集。在不破坏客户代码的情况下(无法编译),您无法更改该合同(设置)。
如果您的方法返回类型是Set,那么您在javadoc或方法名称中承诺您的客户端/调用者并不重要,您仍然可以随时更改实现以返回未排序的集合。如果返回类型是Set并且调用者想要SortedSet功能,他们可以将返回的值转换为SortedSet(丑陋),但如果您决定要返回一个未排序的(仍然)Set,那么有一天,您的调用者代码将在运行时中断(对您的客户来说风险很大。想象您的客户端代码运行正常,然后他们升级您提供的库...)。
2)呼叫者可能需要一组有序的结果。如果你要返回Set,他们可能会试图重新排序你的结果(你想要阅读你的javadoc吗?)。如果您要返回SortedSet,他们知道他们不需要重新排序。