JDK 14即将在2020年3月17日正式发布啦!自JDK8正式启用之后,距离现在已经5年多时间了。5年时间里很多企业也都换上了JDK 8,随着JDK9-13的陆续发布,许多企业也进行了更新迭代,技术"尝鲜"。本次播妞为大家讲解JDK 14新特性的同时也准备了全网最全的JDK福利资源,帖子下方可见哦~ JDK 14官方计划
2019/12/12 | | Rampdown Phase One (初始预备阶段) | 2020/01/16 | | Rampdown Phase Two(加速第二阶段) | 2020/02/06 | | Initial Release Candidate(初始阶段确定哪些新特性作为发行备选) | 2020/02/20 | | Final Release Candidate(最终确定哪些新特性作为发行备选) | 2020/03/17 | | General Availability(一般通用性,可视为发行出稳定版本的JDK新特性) | 关于 JDK 14新特性预览相关介绍
JDK 14一共发行了16个JEP(JDK Enhancement Proposals,JDK 增强提案),即是筛选出的JDK 14新特性。 - 305: instanceof 的模式匹配 (预览,预览版本意味着暂时可以先尝试)
- 343: 打包工具 (Incubator)
- 345: G1的NUMA内存分配优化
- 349: JFR事件流
- 352: 非原子性的字节缓冲区映射
- 358: 友好的空指针异常
- 359: Records (预览)
- 361: Switch表达式 (标准)
- 362: 弃用Solaris和SPARC端口
- 363: 移除CMS(Concurrent Mark Sweep)垃圾收集器
- 364: macOS系统上的ZGC
- 365: Windows系统上的ZGC
- 366: 弃用ParallelScavenge + SerialOld GC组合
- 367: 移除Pack200 Tools 和 API
- 368: 文本块 (第二个预览版)
- 370: 外部存储器API (Incubator)
对于JDK 14新特性的深入理解
本次,我们来针对JDK 14准备发行的第一个显著新特性做一些讲解,让大家提前了解一下JDK 14其它新特性我们将在后期的视频中做详细的讲解梳理。稍候播妞也会将文档上传附件,大家可以直接在本帖上下载哦~
JEP 305: instanceof的模式匹配 (预览) 305: Pattern Matching for instanceof (Preview) 引入
JEP 305新增了使instanceof运算符具有模式匹配的能力。模式匹配能够使程序的通用逻辑更加简洁,代码更加简单,同时在做类型判断和类型转换的时候也更加安全,接下来我们来详细讲解一下。
设计初衷
几乎每个程序员都见过如下代码,在包含判断表达式是否具有某种类型的逻辑时,程序会对不同类型进行不同的处理。我么来看一下熟悉的instanceof-and-cast用法:
```java
// 在方法的入口接收一个对象
public void beforeWay(Object obj) {
// 通过instanceof判断obj对象的真实数据类型是否是String类型
if (obj instanceof String) {
// 如果进来了,说明obj的类型是String类型,直接进行强制类型转换。
String str = (String) obj;
// 输出字符串的长度
System.out.println(str.length());
}
}
```
这段程序做了3件事: - 先判断obj的真实数据类型
- 判断成立后进行了强制类型转换(将对象obj强制类型转换为String)
- 声明一个新的本地变量str,指向上面的obj
这种模式的逻辑并不复杂,并且几乎所有Java程序员都可以理解。但是出于以下原因,上述做法并不是最理想的: - 语法臃肿乏味
- 同时执行类型检测校验和类型转换。
- String类型在程序中出现了3次,但是最终要的可能只是一个字符串类型的对象变量而已。
- 重复的代码过多,冗余度较高。
JDK 14提供了新的解决方案:新的instanceof模式匹配 ,新的模式匹配的用法如下所示,在instanceof的类型之后添加了变量str。如果instanceof对obj的类型检查通过,obj会被转换成str表示的String类型。在新的用法中,String类型仅出现一次。 具体描述 示例代码: ```java
public void patternMatching(Object obj) {
if (obj instanceof String str) {
// can use str here
System.out.println(str.length());
} else {
// can't use str here
}
}
```
上述代码需要注意: 如果obj是String类型,则将obj类型转换为String,并将其赋值给变量str。绑定的变量作用域为if语句内部,并不在false语句块内。 接下来我们看一下它的另一个做法: 通常equals()方法的实现都会先检查目标对象的类型。instanceof的模式匹配可以简化equals()方法的实现逻辑。下面代码中的Student类展示了相关的用法。 ```java
public class Student {
private String name ;
public Student(String name) {
this.name = name;
}
// @Override
// public boolean equals(Object o) {
// if (this == o) return true;
// if (o == null || getClass() != o.getClass()) return false;
// Student student = (Student) o;
// return Objects.equals(name, student.name);
// }
// 简化后做法!
@Override
public boolean equals(Object obj) {
return (obj instanceof Student s) && Objects.equals(this.name, s.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
```
小结instanceof运算符“匹配”规则如下: - 如果obj是String类型,则将obj类型转换为String,并将其赋值给变量str。绑定的变量作用域为if语句内部,并不在false语句块内。
- 到这儿,有一定Java基础的同学应该看出来的JDK 14后的instanceof的模式匹配极大的简化了类型检查和转型的问题。
以上是对JDK 14的第一个显著新特性做的一些讲解,其他特性介绍播妞已上传附件,大家可以直接在本帖上下载哦~ 其他特性介绍后续将会录制视频做详细的讲解梳理做详细的介绍,敬请期待哦~最后为大家赠送上本次的福利资源全网最全的JDK8-JDK12资源全套分享; 从JDK8到JDK12的资源以及妥帖备好,添加播妞QQ3414556270即可获取~JDK8-JDK12资源截图 JDK8-JDK12对应源码资料 对Java开发人员来说,最重要的无疑是:switch语句、文本块,intanceof的模式匹配操作,JDK 14还有更多的JEP新特性,我们将在后续的视频资源中做进行进一步的详细深入介绍,播妞也会及时为大家提供最新资源的,请大家持续关注哦!
|