0

我读过Effective Java,它强调尽可能使用接口作为返回类型。扩展论点,我想知道以下哪种方法是首选/被认为是一种好的做法。

选项1:

 Map<Integer, Set<Integer>> map = new HashMap<Integer, Set<Integer>>(); // Interface 'Set' declared in type
 for (int v = 0; v < graph.getNumberOfVertices(); v++) {
     map.put(v, new HashSet<Integer>());
 }

选项 2:

Map<Integer, Set<Integer>> map = new HashMap<Integer, HashSet<Integer>>(); // Class 'HashSet' declared in type.
for (int v = 0; v < graph.getNumberOfVertices(); v++) {
    map.put(v, new HashSet<Integer>());
}
4

3 回答 3

2

绝对应该使用选项1。选项 2 不会编译,因为 aMap<Integer, HashSet<Integer>>不是Map<Integer, Set<Integer>>.

于 2013-08-16T20:26:19.917 回答
0

是的,通常更喜欢接口作为类型参数,除非您有特定的理由强制您的接口的用户使用特定的实现。

在这种情况下,假设您要返回map, map 的值将Map<Integer, Set<Integer>> map在分配中转换为。

编辑:除了因为在java中不起作用,因为Java不支持协变类型参数,所以Map<Integer, HashSet<Integer>>不是`Map>。但它可以在 Scala 中工作;)

于 2013-08-16T20:28:42.450 回答
0

假设其他人指出的错误,选项 1 是更通用的选项。

这种类型的编程通常是更有用的版本,因为它可以用于所有类型的集合。这样,如果您使用不同的集合类型,您就不必编写所述代码的多个版本。

于 2013-08-16T20:51:11.040 回答