Java8特性之接口的默认方法与静态方法

news/2024/7/5 23:34:22


简介

     Java 8用默认方法与静态方法这两个新概念来扩展接口的声明。 它允许添加新方法到已有接口中,但是不会破坏那些基于老版接口实现的代码的二进制兼容性。 默认方法和抽象方法的区别在于:抽象方法是必须要实现的,而默认方法不是。

意义

众所周知,我们应该使用接口编程,接口使得在交互时不需要关注具体的实现细节,从而保持程序的松散耦合。在API的设计中,设计简约而清晰的接口非常重要。被称作固定定律的接口分离定律,其中有一条就讲到了应该设计更小的特定客户端接口而不是一个通用目的的接口。良好的接口设计是让应用程序和库的API保持简洁高效的关键。如果你曾有过接口API设计的经验,那么有时候你会感觉到为API增加方法的必要。

举个例子,假设你设计了一个简单的API Calculator,里面有add、subtract、devide和multiply函数。 为了实现Calculator这个接口,需要写如下一个BasicCalculator类。如果 Calculator这个API非常简单实用,其他开发者只需要创建一个BasicCalculator就可以使用这个API。 然而,对于多个开发者来说,事实上给人的感觉却是此API的用户并不是面向这个接口进行编程,而是面向这个接口的实现类在编程。
如果我们使用默认方法,这样,用户就被强制要求对Calculator接口进行编程,并且不需要关注接口的详细实现。

案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private interface Defaulable {
     // Interfaces now allow default methods, the implementer may or
     // may not implement (override) them.
     default String notRequired() {
         return "Default implementation" ;
     }       
}
         
private static class DefaultableImpl implements Defaulable {
}
     
private static class OverridableImpl implements Defaulable {
     @Override
     public String notRequired() {
         return "Overridden implementation" ;
     }
}

Defaulable接口用关键字default声明了一个默认方法notRequired(),Defaulable接口的实现者之一DefaultableImpl实现了这个接口,并且让默认方法保持原样。Defaulable接口的另一个实现者OverridableImpl用自己的方法覆盖了默认方法。

Java 8带来的另一个有趣的特性是接口可以声明(并且可以提供实现)静态方法。例如:

1
2
3
4
5
6
private interface DefaulableFactory {
     // Interfaces now allow static methods
     static Defaulable create( Supplier< Defaulable > supplier ) {
         return supplier.get();
     }
}

下面的一小段代码片段把上面的默认方法与静态方法黏合到一起。

1
2
3
4
5
6
7
public static void main( String[] args ) {
     Defaulable defaulable = DefaulableFactory.create( DefaultableImpl:: new );
     System.out.println( defaulable.notRequired() );
         
     defaulable = DefaulableFactory.create( OverridableImpl:: new );
     System.out.println( defaulable.notRequired() );
}

这个程序的控制台输出如下:

1
2
Default implementation
Overridden implementation

在JVM中,默认方法的实现是非常高效的,并且通过字节码指令为方法调用提供了支持。默认方法允许继续使用现有的Java接口,而同时能够保障正常的编译过程。这方面好的例子是大量的方法被添加到java.util.Collection接口中去:stream(),parallelStream(),forEach(),removeIf(),……

尽管默认方法非常强大,但是在使用默认方法时我们需要小心注意一个地方:在声明一个默认方法前,请仔细思考是不是真的有必要使用默认方法,因为默认方法会带给程序歧义,并且在复杂的继承体系中容易产生编译错误。更多详情请参考官方文档



http://www.niftyadmin.cn/n/3657229.html

相关文章

NS3概念概述及first.cc讲解

NS3概念概述及first.cc讲解 文章转载自&#xff1a;漫天大雪 一、关键的抽象概念 1.1节点 在因特网术语中&#xff0c;任何一台连接到网络的计算设备被称为主机&#xff0c;亦称为终端。 ns -3是一个网络模拟器&#xff0c;而非一个专门的因特网模拟器&#xff0c;为此我们…

[概念] 属性抽样(attribute sampling)和变量抽样(variable sampling)

PMBOK(2004 3rd 英) P191中提到了质量控制中要注意区分的几个概念&#xff0c;其中提到了属性抽样与变量抽样这一对概念&#xff0c;书上没有详细解释&#xff0c;查阅如下&#xff1a;Attribute Sampling (http://www.answers.com/topic/attribute-sampling?catbiz-fin) :Sta…

TCP/IP为什么要进行三次握手?

定义 三次握手&#xff08;three times handshake&#xff1b;three-way handshake&#xff09;所谓的“三次握手”即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步&#xff0c;根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系&am…

[概念] 争议解决程序 (dispute resolution procedures)

PMBOK (2004 3rd 英) P292关于合同变更控制系统中提到了争议解决程序&#xff0c;但是没有详细展开。http://www.venables.co.uk/adr.htm 给出了一些概念和解释&#xff1a;Alternative Dispute Resolution (ADR) was introduced in the 1980s for the resolution of commercia…

记一次网易2018实习生笔试-大数据岗位

记一次网易2018实习生笔试-大数据岗位 网易2018实习生招聘笔试题-大数据开发实习生-云音乐 凭借印象和草稿&#xff0c;记录下一些题目。 共有20道选择题&#xff0c;3道编程题&#xff0c;2道简答题。 选择题 HDFS Block的概念。TCP/UDP。DNS、Telnet、SMTP、POP等与TCP、…

Java NIO(一)入门篇

概念 java.nio&#xff08;java new IO&#xff09;&#xff0c;是jdk1.4 里提供的新api &#xff0c;为所有的原始类型提供缓存支持。Sun 官方标榜的特性如下&#xff1a; 为所有的原始类型提供(Buffer)缓存支持。字符集编码解码解决方案。 Channel &#xff1a;一个新的原始I…

[概念] 敏感性分析(Sensitivity Analysis) 和龙卷风图(tornado diagram)

PMBOK(2004 3rd 英) P257关于风险定量分析模型技术中有一种技术叫敏感性分析(Sensitivity Analysis), 用于比较各种风险在其他风险处于基准水平的情况下对项目整体产生的影响大小&#xff0c;从而来找出影响最大的风险。龙卷风图(tornado diagram)是一种常用的技术&#xff0c;…

[概念] 风险识别工具 - 影响图(Influence Diagram)

PMBOK(2004 3rd 英) P248关于风险识别的图形技术中提到了因果图(Cause-and-Effect diagram)&#xff0c;流程图(flow chart)和影响图(Influence diagram),其中前两个图由于也是质量管理的工具&#xff0c;在相关章节中有详细介绍和图例&#xff0c;但是影响图尽在此处出现&…