我的方法标题对于它的返回类型有多具体?

时间:2011-09-06 19:44:52

标签: java

如果我有一个返回整数TreeSet的方法,我应该如何声明它?

选项A

public Collection returnSortedIntegers()

选项B

public Set returnSortedIntegers()

选项C

public Set<Integer> returnSortedIntegers()

选项D

public TreeSet<Integer> returnSortedIntegers()

我问的原因是因为当我编译一个在其中一个方法中使用此方法的类时,我收到了-Xlint:unchecked消息。当它看起来像选项A时我编译它没有任何问题,只有当我编译使用该方法的不同类时,我才得到xlint消息,这就是为什么我将它更改为选项C并且消息已经消失。 / p>


感谢您的回答,这似乎是胜利

选项E

public SortedSet<Integer> returnSortedIntegers()

我正在研究Java,所以这对我来说很新,我不知道SortedSet接口,我只知道TreeSet是Set的子类。一如既往Stack Overflow让我开明了。

4 个答案:

答案 0 :(得分:7)

我会选择

Set<Integer> returnSortedIntegers()

OR:

SortedSet<Integer> returnSortedIntegers()

如果调用者需要直接访问与Set被排序的事实相关的方法。

我的规则是在保持类型安全的同时保持尽可能通用。

答案 1 :(得分:3)

我会选择选项C.

我的经验法则是始终在我的Parameters / returns对象中使用接口。这样,您可以获得更多的多态性。

使用泛型总是一个好主意,因为对于方法的用户而言,集合包含整数是绝对的。在Generics之前,我们必须知道实现以找出存储了什么类型的Object: - (

答案 2 :(得分:3)

选项E:

public SortedSet<Integer> returnSortedIntegers()

这给了调用者他们需要知道的最少信息,这些信息在返回时仍然有用:

  • 这是Set
  • 它包含Integer
  • 已分类

答案 3 :(得分:1)

最常被接受的方法是返回适当接口的通用版本。

所以在你的情况下,它很可能是 C 或者,正如其他人所建议的那样,

public SortedSet<Integer> returnSortedIntegers()

因为它是一个有序集。

取决于您的方法的预期目的,也可能是

public Collection<Integer> returnSortedIntegers()

因为您没有明确定义它是否应该具有Set的属性。

话虽如此,有些情况下最明确的情况(D)也是正确的,假设您希望方法的用户知道它是并且始终是TreeSet。这将假设此数据结构的特定属性始终是必需的,因此没有其他返回类型是合适的。