面向对象编程的超级能力之一是具有相同类型的多个实现的能力。这可以允许更强大的用法的更干净的代码。Java提供了两种主要机制来完成此任务介面
和抽象
类。两者之间的主要区别在于,为了扩展抽象类,实现类必须成为该抽象类的子类。为了实现接口,实现类仅需满足该类的一般约定。
接口的优点是什么:
- 可以在事实之后添加接口。
- 类层次结构是事实之后要更改的相当沉重且僵化的东西,而接口可以非常简单地添加并且不会更改现有类的语义。一世>
- 一种
混入
是除类的主要用途之外的附加行为。例如,
可比
是混入的示例。尽管它定义了对象具有某些行为,但它并没有脱离对象的根类型。一世>接口允许共享行为,而无需依赖层次结构
- 类迫使我们使用扩展来添加行为。这就要求我们建立一个层次结构来实现这一点。虽然通过层次结构组织我们的课程可能是适当且有用的,但在很多情况下,这并不是表达这一观点的最有效方法。
有效的Java然后进入一种有趣的模式,在这种模式下,我们可以充分利用接口和抽象类。这个想法是将实现的所有部分推到尽可能低的层次,同时仍提供代码帮助者的用户来帮助他们。您可以直接在界面中放很多东西,例如方法签名和默认方法。但是,有些事情我们将无法在界面中提供。例如,成员变量或非公共静态成员。那么在这些情况下我们该怎么办?我们刚刚讨论了应该如何选择接口,但是我们可能会感到,尤其是接口相当复杂或复杂(请考虑清单
接口),我们应该为实现者提供一个开始的位置,或者每个实现都需要或需要的共享功能不适合接口的允许元素。
这是哪里骨架实现是一个有用的结构。一种骨架实现让我们两全其美。实际上,它只是一个抽象类,它实现一个接口,然后实现一个接口的非基本方法。通过这样做,我们可以将大部分工作都花在实现接口上。您经常可以认出这些骨架实现在野外,因为它们经常遵循相同的命名约定,Abstract<Interface>
哪里<Interface>
是该类为其提供骨架接口的接口的名称。例如,抽象馆藏
,抽象集
等等。正确完成此模式后,实现接口很简单。例如,让我们看看如何实现清单
在。。。的帮助下摘要清单
骨架实现.
静态的清单<整数>整型ArrayAs清单(整型[]数组){返回 新 摘要清单<整数> {@Override上市 整数 得到(整型 i) {返回 数组[i];}@Override上市 整数 组(整型 i) {整型 旧值 = 数组[i];数组[i] = i;返回 旧值;}@Override上市 整型 尺寸() {返回 数组.长度;}}; }
就是这样,清单
在这三个简短的覆盖函数中。 当您想到一切时,这真是太神奇了清单
为我们做。 这样做的好处是没有人被迫使用骨架实现, if someone wants to start from scratch and implement the 整型erface they are free to, the thing people are dependent on is the 整型erface, not the 骨架实现。 最后,正如我们在上一章的回顾中了解到的那样,我们应确保记录这些内容。骨架实现以及它们是为继承而实现的。
In summary, 整型erfaces are usually the way to define a shared type and when you create a nontrivial 整型erface you should consider creating a 骨架实现界面的功能,以帮助未来课程的创建者。
from: https://dev.to//kylec32/effective-java-tuesday-prefer-interfaces-to-abstract-classes-21cn