编程语言
首页 > 编程语言> > Java集合类当中重复实现接口问题的研究

Java集合类当中重复实现接口问题的研究

作者:互联网

因为学习看了集合类的源码,
发现 ArrayList实现了List接口,之前觉得很正常,
但看到它继承了AbstractList抽象类,而AbstractList抽象类也实现了List接口。
就有些疑问,为什么?如果AbstractList实现了List接口,那么继承了AbstractList的ArrayList就完全没必要实现List接口吧?

同样的案例还有比如

public class LinkedHashSet<E>
    extends HashSet<E>
    implements Set<E>, Cloneable, java.io.Serializable {

看网上有各种说法,总结有以下这些:

  1. I've asked Josh Bloch, and he informs me that it was a mistake. He used to think, long ago, that there was some value in it, but he since "saw the light". Clearly JDK maintainers haven't considered this to be worth backing out later.
    这是链接:http://stackoverflow.com/questions/2165204/why-does-linkedhashsete-extend-hashsete-and-implement-sete
  2. 冗余设计
  3. 接口意义在于规范设计,但接口是没有具体实现的(1.8版本之后的静态方法除外),所有继承它的类都需要一个个实现它的所有方法。
    但是呢接口可能有些方法具有一定的通用性,也就是说不需要所有实现类都单独实现(实现了代码也是重复的),有一个类实现这几个方法,大家都去继承它好了,剩下的接口大家各自实现,这就是模板类的意义。
    现在关键问题来了,为什么要把这个模板类定义成抽象类呢?其实上面已经给出了答案,因为继承接口的实现类必须要实现接口的所有方法,而模板类仅仅是为了实现一些通用方法不需要实现所有接口方法(总不能为了提供这个模板,稀里糊涂的把所有接口方法都实现了吧,没有必要不说,还和可能产生不必要的使用。),这时候抽象类就符合这个需求了。
    抽象类实现了通用的接口,剩下的接口谁继承我谁实现,而且抽象类本身又不能实例化,不会产生没有实现的接口滥用。既实现了代码的最大化复用,又实现了代码的最大化精简。类似 高内聚,低耦合
  4. 在反射时更容易获得那个接口而不用去递归从父类中获得,这个确实会方便一些。
  5. javadoc的生成有关。

这个问题很有意思,因为涉及到很多东西。
比如

  1. 反射时更容易获得那个接口?
  2. 是否真的和javadoc的生成有关?
  3. 对接口的意义和模板,框架设计的思考。

先记录下,以后有时间好好思考研究下。

参考链接:
https://stackoverflow.com/questions/2165204/why-does-linkedhashsete-extend-hashsete-and-implement-sete
https://bbs.csdn.net/topics/391996408?page=1#post-401441102

标签:Java,实现,List,接口,集合,抽象类,AbstractList,模板
来源: https://www.cnblogs.com/virde/p/15754300.html