我已阅读 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>());
}
答案 0 :(得分:2)
绝对应该使用选项1。选项2将无法编译,因为Map<Integer, HashSet<Integer>>
不是Map<Integer, Set<Integer>>
。
答案 1 :(得分:0)
是的,通常更喜欢类型参数的接口,除非您有特定的理由强迫接口的用户使用特定的实现。
在这种情况下,假设您要返回map
,地图的值将转换为作业中的Map<Integer, Set<Integer>> map
。
编辑:除了因为在Java中不起作用,因为Java不支持协变类型参数,所以Map<Integer, HashSet<Integer>>
不是`Map&gt;。但它可以在Scala中使用;)
答案 2 :(得分:0)
选项1是更通用的选项,假设其他人指出的错误。
这种类型的编程通常是更有用的版本,因为它可以用于所有类型的集合。 这样,如果使用不同的集合类型,则不必编写所述代码的多个版本。