关于 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 的第一个显著新特性做的一些讲解, 其他特性介绍以及免费资源获取:
JDK14 将于 3 月 17 日正式发布, 提前尝鲜, 获取 JDK 全网最全资源 (点击领取)
对 Java 开发人员来说, 最重要的无疑是: switch 语句, 文本块, intanceof 的模式匹配操作, JDK 14 还有更多的 JEP 新特性, 黑马程序员将在后续的视频资源中做进行进一步的详细深入介绍, 笔者也会及时为大家提供最新资源的, 请大家持续关注哦!
来源: http://www.jianshu.com/p/f2c888f2ba1a