在【第25条】中已经讲过“应该使用接口,而不是类作为参数的类型”。更进一步地讲,应该优先使用接口而不是类来引用对象。也就是说,当我们在考虑引入一个引用变量的时候,应该首先考虑的是,我们需要一个具有什么样功能的变量,也就是选择一个什么接口。之后才是在众多的实现类中选择一个合适的实现进行初始化。
// Interface object = new Class();
Map myTable = new Hashtable();
如果你养成了使用接口作为类型的习惯,那么你的程序将会更加灵活。
如果没有合适的接口存在的话,那么,用类而不是接口来引用一个对象,是完全合适的。在写本条笔记之前,我也曾在论坛上发过两个帖子讨论类似的问题。一个案例是,我的一个应用中,需要一个 key—value 对的数据类型,并需要能够得到当前所有的 keys 和所有的 values,甚至为了“保护性拷贝”(参考【第24条】)时还需要 clone 之。
然而 Map 接口,可能并不能完全满足我的需求, values() 方法来自Map接口,而 keys() 方法来自Dictionary抽象类,clone() 方法则当然来自Cloneable接口。所以,没有一个合适的接口的时候,我只有使用 Hashtable 类了。
public class Hashtable extends Dictionary implements Map, Cloneable, ...
具体讨论贴:http://www.iteye.com/topic/392921
另外一个帖子,是关于接口与抽象骨架实现类及其子类的关系的:http://www.iteye.com/topic/385733
【Effective Java 学习笔记】系列连载专题请见:
http://tonylian.iteye.com/categories/64208