Java 为什么声明的时候不使用具体的实现类而使用接口,通过接口引用对象?


我们在代码开发的过程中,经常会遇到这样的写法:

1 Map map = new HashMap(); 
2
3 List
list=new ArrayList();

不知道有没有疑惑过,为什么不直接使用下面的方法呢?

1 HashMap map = new HashMap();
2 
3 ArrayList list=new ArrayList();

第52条:通过接口引用对象

作者认为,如果有合适的接口类型存在,那么对于参数、返回值、变量和域来说,就都应该使用就接口类型进行声明。

只有当你利用构造器创建某个对象的时候,才真正需要引用这个对象的类。

// 一个好的栗子

Map map = new HashMap(); 

// 一个不好的栗子

HashMap map = new HashMap();

这样做的好处在于:你的程序会更灵活。当你决定更换实现的时候,所要做的就只是:改变构造器中类的名称。就比如:

Map map = new TreeMap<>();

如果不这么做,在最早就使用了HashMap来声明了map,如果客户端在其他地方,使用了HashMap的操作,那么后续若改动了,则无法通过编译了。

同样,对于

List list=new ArrayList();

在这个例子中,List为父类接口,提供标准的method。ArrayList和LinkedList都是其子类,即对父类接口List的不同实现。

若在最初编写代码时选用ArrayList,而随着需求变更需要替换成LinkedList。使用List list=new ArrayList()创建list,在改变list的实现时(从ArrayList换成LinkedList)只需改变一句话,即List list=new LinkedList(),而对list的调用均无需改变