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的调用均无需改变