近年来,甲骨文做出了一些突破性的决定。 他们包括新的半年发布模式与预览功能和更短的发布和反馈周期的新功能。 许可模式也发生了变化,Oracle JDK 不再免费提供。 这加剧了竞争,因此您现在可以从包括 Oracle 在内的各种供应商获得免费的 OpenJDK 发行版。 自从 java11以来,它已经与 oraclejdk 实现了二进制兼容,并且采用开源许可证。

一年半以前,最后一个 LTS 版本 Java 11于2019年秋季发布。 从那时起,随后的两个主要版本只有有限数量的新特性。 JDK 孵化器项目(Amber, Valhalla, Loom …) ,然而,正在致力于许多新想法,所以不足为奇的是,刚刚发布的 JDK 14的功能范围再次显著扩大。 即使只有少数人会在生产环境中使用新版本,您仍然应该关注新特性,并尽早就预览功能提供反馈。 这是确保新特性投入生产直到下一个 LTS 版本最终完成的唯一方法,该版本将在2021年秋季以 Java 17的形式发布。

下列Java增强建议(JEP)已经实现。在本文中,我们将从开发人员的角度来仔细研究感兴趣的主题。

JEP 305: Pattern Matching for instanceof (Preview)
JEP 343: Packaging Tool (Incubator)
JEP 345: NUMA-Aware Memory Allocation for G1
JEP 349: JFR Event Streaming
JEP 352: Non-Volatile Mapped Byte Buffers
JEP 358: Helpful NullPointerExceptions
JEP 359: Records (Preview)
JEP 361: Switch Expressions (Standard)
JEP 362: Deprecate the Solaris and SPARC Ports
JEP 363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector
JEP 364: ZGC on macOS
JEP 365: ZGC on Windows
JEP 366: Deprecate the ParallelScavenge + SerialOld GC Combination
JEP 367: Remove the Pack200 Tools and API
JEP 368: Text Blocks (Second Preview)
JEP 370: Foreign-Memory Access API (Incubator)

JEP 305: Pattern matching for instanceof

自20世纪60年代以来,模式匹配语言的概念已经在各种编程语言中得到了应用。 其中最现代的例子是 Haskell 和 Scala。 模式是一个谓词的组合,该谓词匹配目标结构和该模式中的一组变量。 如果这些变量匹配,则为它们分配相应的内容。 其目的是破坏对象,也就是将它们分解为它们的组件。

到目前为止,Java 只能区分 switch 语句中的数据类型 integer、 string 和 enum。 然而,随着 Java 12中开关表达式的引入,迈向模式匹配的第一步已经迈出。 使用 Java 14,我们现在可以额外地使用模式匹配操作符 instanceof。 避免了不必要的强制转换,减少的冗余提高了可读性。

例如,在此之前,必须按照以下步骤检查空字符串或空集合:

boolean isNullOrEmpty( Object o ) {return == null ||instanceof String && ((String) o).isBlank() ||instanceof Collection && ((Collection) o).isEmpty();
}

现在您可以在使用 instanceof 检查时直接将值赋给变量,并对其执行进一步调用:

boolean isNullOrEmpty( Object o ) {return o == null ||o instanceof String s && s.isBlank() ||o instanceof Collection c && c.isEmpty();
}

这种区别似乎微不足道,然而,Java 开发人员中的纯粹主义者节省了一个小而烦人的冗余。

开关表达式最早是在 Java 12和13中引入的,在这两种情况下都是作为一个预览特性。 它们现已在 jep361中最后确定。 这为开发人员提供了两种新的语法变体,它们具有更短、更清晰和更不容易出错的语义。 表达式的结果可以分配给变量,或者作为方法的值返回(清单1)。

JEP 358: Helpful NullPointerExceptions

对空引用的无意访问也是 Java 开发人员所担心的。 根据托尼•霍尔爵士(Sir Tony Hoare)自己的说法,他发明的零Y引用是一个错误,其后果高达数十亿美元。 这仅仅是因为在20世纪60年代阿尔戈语的发展过程中,它是如此容易实现。

在 Java 中,编译器和运行时环境都不支持处理零引用。 这些恼人的异常可以通过各种变通方法来避免。 最简单的方法是将检查设置为零。 不幸的是,这个过程非常繁琐,当我们需要它的时候我们往往会忘记它。 使用自 JDK 8以来包含的包装器类 Optional,您可以通过 API 显式地告诉调用者,一个值可以为零,并且它必须对此进行响应。 因此,您不能再意外地遇到空引用,而必须显式地处理可能为空的值。 这个过程对于公共接口的返回值非常有用,但是也会消耗额外的间接层,因为您总是需要解压实际值。

在其他语言中,辅助工具早已构建到语法和编译器中,比如Groovy中 NullObjectPattern 和 Safe Navigation 操作符(some?.method())。 在 Kotlin,可以明确区分可能不为空的类型和可能作为引用为 null 的类型。 我们将来也必须使用 Java 中的 nullpointerexception。 但是,作为预览特性引入的有用的NullPointerExceptions可以简化异常的故障排除。 为了在抛出 NullPointerException 时插入必要的信息,必须在启动时激活选项 -XX: + ShowCodeDetailsInExceptionMessages。 如果调用链中的一个值为零,那么您将收到一条有用的消息:

man.partner().name()Result: java.lang.NullPointerException: Cannot invoke "Person.name()" because the return value of "Person.partner()" is null

Lambda表达式需要特殊处理。 例如,如果lambda函数的参数为零,则默认情况下将收到清单2所示的错误消息。要显示正确的参数名称,必须使用-g:vars选项编译源代码。 结果如下:

java.lang.NullPointerException: Cannot invoke "Person.name()" because "p" is null

Listing 2 清单2

Stream.of( man, woman ).map( p -> p.partner() )
.map( p -> p.name() )
.collect( Collectors.toUnmodifiableList() );Result: java.lang.NullPointerException: Cannot invoke "Person.name()" because is null "

不幸的是,当一个空参数时,目前没有方法引用的指示:
但是,如本例所示,如果将每个流方法调用放在新行中,那么麻烦的代码行可以很快地缩小范围。 NullPointerExceptions在自动装箱/拆箱中也具有挑战性。 如果在这里也激活了编译器参数-g:vars,您还将收到新的有用的错误消息(清单3)。

Listing 3 清单3
int calculate() {Integer a = 2, b = 4, x = null;return a + b * x;
}
calculate();
Result: java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because "x" is null

JEP 359: Records

也许最令人兴奋的同时也是最令人惊讶的创新是记录类型的引入 。 它们是在Java 14发行中相对较晚实现的,是一种类声明的限制形式,类似于枚举。 记录是在Valhalla项目中开发的。 与Kotlin中的Data Classes和Scala中的Case Classes有某些相似之处。 紧凑的语法可能会使Lombok之类的库在将来过时。 Kevlin Henney还看到了以下优点:“我认为Java记录功能的有趣的副作用之一是,实际上,它将帮助揭示多少Java代码实际上是面向 getter / setter而非面向对象的。” 一个人有两个字段的简单定义可以在这里看到 :

public record Person( String name, Person partner ) {}

一个带有附加构造函数的扩展变量,因此只有字段name 是强制的,也可以实现:

public record Person( String name, Person partner ) {public Person( String name ) { this( name, null ); }public String getNameInUppercase() { return name.toUpperCase(); }
}

编译器生成一个不可变类,除了这两个属性和它自己的方法之外,它还包含访问器的实现(没有 getter!) 、构造函数 equals / hashcode 和 toString (清单4)。

Listing 4 清单4
public final class Person extends Record {private final String name;private final Person partner;public Person(String name) { this(name, null); }public Person(String name, Person partner) { this.name = name; this.partner = partner; }public String getNameInUppercase() { return name.toUpperCase(); }public String toString() { /* ... */ }public final int hashCode() { /* ... */ }public final boolean equals(Object o) { /* ... */ }public String name() { return name; }public Person partner() { return partner; }

使用的行为符合预期,您无法从调用方判断记录类型是实例化的(清单5)。

Listing 5 清单5
var man = new Person("Adam");
var woman = new Person("Eve", man);
woman.toString(); // ==> "Person[name=Eve, partner=Person[name=Adam, partner=null]]"woman.partner().name(); // ==> "Adam"
woman.getNameInUppercase(); // ==> "EVE"// Deep equals
new Person("Eve", new Person("Adam")).equals( woman ); // ==> true

总结

Java没有死,Java万岁! 半年两次的OpenJDK版本使语言和平台都受益。 这次,新功能比Java 12和13还要多。而且,仍有许多功能需要在将来的版本中实现。 因此,我们的Java开发人员不会感到无聊,并且未来的前景仍然一片光明。 到2020年9月,我们可以预见Java 15的到来。

【关注公众号 “码农架构”】回复:“资料” 最新面试资料整理文档

JDK 12 ,JDK 13 , JDK 14 新特性 详解相关推荐

  1. JDK 5、6、7、8、9、10、11、12、13、14 新特性汇总

    JDK5 新特性 自动拆装箱 Foreach 静态导入 可变参数 Var args 枚举 格式化输出 泛型 ProcessBuilder 内省 线程并发库(JUC) 监控和管理虚拟机 元数据 JDK6 ...

  2. 还在用JDK6的同学,来看看JDK13新特性详解吧

    点击上方"搜云库技术团队"关注,选择"设为星标" 回复"面试题"或"1024"获取 4T 学习资料 在 JDK 版本的世 ...

  3. java11 新特性 详解

    为什么80%的码农都做不了架构师?>>>    引言: 点击-->java10 新特性 详解 点击-->java9 新特性 详解 点击-->java8 新特性 详解 ...

  4. Java9 新特性 详解

    目录 Java9 新特性 详解 1.Java9新特性之---目录结构 2.Java9新特性之---JShell工具 3.Java9新特性之---模块化 4.Java9新特性之---多版本兼容Jar包 ...

  5. laya龙骨换装_DragonBones 5.3 新特性详解

    本帖最后由 superlancelot 于 2017-7-12 13:40 编辑 DragonBones 5.3新特性详解 本次DragonBones5.3 相对上一个版本5.2提供了很多新增功能和用 ...

  6. oracle dataguard详解,Oracle 19c 新特性详解:DataGuard 中ADG的自动DML重定向

    Oracle 19c 新特性详解:DataGuard 中ADG的自动DML重定向 在前面的文章<Oracle 19c 十大新特性一览>中,我们曾经提到 Oracle 19c的一个重要增强, ...

  7. Oracle 18c新特性详解-多租户专题

    Oracle 18c,传说中全球第一款自动驾驶数据库,正式到来.18c不仅仅是数据库,更是一种云服务,包括着Oracle数据库18c,Oracle云基础架构和Oracle云工具,机器学习,能够实现自治 ...

  8. 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高...

    第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...

  9. Java基础学习总结(33)——Java8 十大新特性详解

    Java8 十大新特性详解 本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API ...

最新文章

  1. Python3 列表List
  2. 总分的公式计算机,装机模拟器各配件跑分及计算公式分享 3DMark分数怎么算 3DMark分数计算公式_游侠网...
  3. 常用汉字的unicode编码
  4. Class.newInstance()与new、Constructor.newInstance()的区别
  5. 都在说GPT-3和AlphaFold,2020没点别的AI技术突破了?
  6. 【CyberSecurityLearning 33】Nginx和Tomcat服务的搭建、Nginx负载均衡
  7. [渝粤教育] 西南科技大学 土木工程施工 在线考试复习资料(1)
  8. css知识笔记(二)——盒子模型
  9. lightbox自定义图片大小的实现
  10. 计算机动画制作 教学设计,《设置动画效果》教学设计
  11. 用递归与分治策略求解网球循环赛日程表_算法设计:分治法(比赛日程安排)...
  12. NHibernate源码分析开篇
  13. loadrunner11破解失败,已解决“ license security violation.Operation is not allowed ”问题
  14. C/C++ 用zlib解压gzip文件
  15. 存储解决方案之——FC存储解决方案
  16. 车载BlueTooth通话机制原理及开发
  17. python编程-----利用爬虫获取自如房间信息(二)
  18. 【drawio笔记】在图表中添加和删除图层
  19. 腾讯云Linux云服务器如何搭建FTP服务?
  20. 关于Java反射获取静态属性值的方式

热门文章

  1. 【微信小程序】collection.watch实现对云端数据的实时监控
  2. \(^_^)/ ITeye 优秀专栏文章汇总
  3. Java实例方法、实例变量、类方法、类变量
  4. UI设计准则在360云盘的运用
  5. 小前端有话说之:[Vue warn]: Avoid mutating a prop directly since the value will be overwritte父子组件传值问题及sync用法
  6. Flash 第十二章 图层和场景简单复习
  7. 笔记本电脑双显示器_如何在笔记本电脑中添加额外的显示器
  8. 高新技术企业认定标准
  9. 极客日报:​​​字节员工操纵抖音热榜被判刑;微信群聊可直接访问电商外链;JetBrains发布新一代编辑器Fleet
  10. 蓝牙耳机延迟受什么因素影响?有没有玩游戏延迟低的品牌推荐?