I have read Effective Java which emphases on using Interfaces where possible as return types. Extending the argument I was wondering which of the following methods was preferred / considered a good practice.
OPTION 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>());
}
OPTION 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>());
}
Definitely option 1 should be used. Option 2 won't compile, because a
Map<Integer, HashSet<Integer>>
is not aMap<Integer, Set<Integer>>
.