我正在学习HashSets和Queues,我很难理解为什么将Queue / hashMap /其他java.util预定义数据结构声明为:
Set<T> h = new HashSet<T>();
Queue<T> q = new LinkedList<T>();
我理解<T>
可以是Integer / String /其他数据类型,这是为了确保我们将相同的数据类型添加到数据结构中。但是,我不明白为什么我必须将它声明为新的HashMap,当它是HashSet时。我关注this。有没有办法知道HashSet / Queue /其他必须只被声明为HashMap / LinkedList?非常感谢!如果我必须解释/修改我的问题,请告诉我。
答案 0 :(得分:3)
这称为接口编码而不是实现。如果需要,具有接口参考可以灵活地在以后更改实现。例如今天,您正在使用 HashSet,因此您将其定义为:
Set<T> h = new HashSet<T>();
但是如果以后你意识到你需要一个LinkedHashSet
那么只需要替换它
Set<T> h = new LinkedHashSet<T>();
不改变任何其他代码。这就是为什么这被称为良好的编码实践。
答案 1 :(得分:1)
这只是遵循“编码到接口而不是实现”的规则。这将为您的程序提供更大的灵活性,并允许更容易的测试。使用接口时,隔离和模拟类要容易得多;如果使用接口,使用工厂创建对象以及使用Guice或Spring等工具来执行依赖注入要容易得多。