【第34条】通过接口引用对象

【第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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值