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

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

1 Map<String, Integer> map = new HashMap(); 
2
3 List
<String> list=new ArrayList<String>();

 

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

1 HashMap<String, Integer> map = new HashMap();
2 
3 ArrayList<String> list=new ArrayList<String>();

 

<Effective Java>第52条:通过接口引用对象

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

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

// 一个好的栗子

Map<String, Integer> map = new HashMap(); 

// 一个不好的栗子

HashMap<String, Integer> map = new HashMap();

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

Map<Integer,String> map = new TreeMap<>();

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

 

同样,对于

List<String> list=new ArrayList<String>();

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

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

posted @ 2022-02-13 21:09  r1-12king  阅读(403)  评论(0编辑  收藏  举报