微言码道 · 手记

JDK 18新特性简报

—— JDK 18在2020年3月发布,它是非LTS的JDK版本,但做为Java程序员,我们仍然需要了解JDK 18有什么新特性。 我整理了一份简报以供快速了解

JDK 18已经在今年的3月22日正式发布了。它是一个非长期支持版的JDK。

我在这篇文章将简述一下JDK 18中有哪些新特性,以供大家参阅与了解。

由于JDK 18不是LTS版本的SDK,所以你可能不会真正去使用它,但做为Java程序员,我们仍然有义务去了解它有哪些新特性

LTS与非LTS

在开始之前,我希望再解释一个JDK中的LTS版本与非LTS版本的概念。因为很多Java程序员还是在使用JDK 8,所以对后续JDK发行机制变更并不一定清楚。

2017年的时候,Oralce公司对JDK的发行做了变更,由以前的每三年发行一个JDK版本,修改为每三年发行一个LTS的JDK版本,而每半年发行一个非LTS的JDK版本。(后续Oracle已经提议将每三年一个LTS版本修改为每二年发行一个LTS版本)

这样的好处显而易见,可以让JDK更快的加入新特性并让程序员使用与体验到,加速JDK的改进与优化。

JDK 9是第一个非LTS的JDK版本,JDK 11是之后的第一个LTS JDK版本,JDK 17是当前最新的LTS版本。

JDK 18的新特性

所以,现在你应该清楚了,JDK 18是个非LTS版本,通常情况下,我们只会使用JDK LTS版本。但知道非LTS版本有哪些新特性,对我们Java程序员业说,也是非常有必要的。

JDK 18的新特性列表如下:

  • UTF-8 by Default 默认使用UTF-8字符编码
  • Simple Web Server 简单Web服务器
  • Code Snippets in Java API Documentation API文档支持代码片断
  • Reimplement Core Reflection with Method Handles 重构反射的实现
  • Vector API (Third Incubator) 向量API(孵化第三版)
  • Internet-Address Resolution SPI 网络地址解析 SPI
  • Foreign Function & Memory API (Second Incubator) 外部函数&内存API (孵化第二版)
  • Pattern Matching for switch (Second Preview) switch模式自动匹配(预览第二版)
  • Deprecate Finalization for Removal 将Finalization标记为过期

以下对每个特性的简述

本篇文章只是简述,我只会简单的描述这个特性是什么以及为什么需要这个特性,不会用代码详细的展示如何使用这新特性。

1. UTF-8 by Default

它是什么

将JDK中的字符集,默认设置为UTF-8

为什么需要这个特性

过往,JDK的一些API中,比如读取文件使用的字符集依赖于操作系统。那就意味着在不同的操作系统,同一个API得到预期不一致的结果。

举例说明,很多国内Java程序员,都可能遇到过中文乱码问题,这种情况下我们会指定UTF-8做为编码集,以规避这个问题,但前提是你记得指定UTF-8编码。

现在,JDK 18解决了这个预期不一致的现象,这意味着在不指定编码集的情况下,不同的操作系统的代码仍然使用的是同一个字符集。这样强化了Java的可移植性。

2. Simple Web Server

它是什么

JDK 18提供了一个简单的WEB服务,支持静态网站的访问。它不支持JSP或Servlet等,也不支持访问权限控制,授权等任何高级特性。它只是一个简单的Web服务器

为什么需要这个特性

主要支持程序员用于原型展示,测试等场景的。

举例说明,我在编写后端API的同时,会使用OpenApi来编写标准的API文档给前端或移动端人员参考。在vert.x中,由于支持static router,所以我可以把这个API文档一同打包进JAR中,启动JAR就能访问到这个API文档,非常方便。

但在JDK中,以前是做不到的,只能另外将其部署到nginx中,现在有了这个特性,一样也能做到了。还是挺方便的。

不过要记住,它不能取代nginx,也不能取代tomcat等生产用的服务器。

3. Code Snippets in Java API Documentation

它是什么

在Java doc中,以往你可以使用 @code来嵌入一些代码片断,但它有一些不足。于是JDK 18提供了更好的@snippet标签来让你在java doc中嵌入代码。

为什么需要这个特性

@code有一些不足,比如不支持语法高亮;不被IDE识别为代码无法基于代码模式来编辑它,只被认为是普通文本;不支持HTML标签等。而@snippet就是为了改善这些不足而出的。

4. Reimplement Core Reflection with Method Handles

它是什么

JDK 18重新实现了反射API背后的实现机制。这个特性是隐藏式特性,也就是你在JDK 18中使用反射的API, API并没有任何变化,但背后的实现更简洁与高效了

为什么需要这个特性

因为过往JDK对反射的实现并不优雅,JDK反射内部机制复杂,有三种不同的内部实现来支撑:

  • 使用VM native methods来实现反射
  • 使用动态生成的字节码来实现反射
  • 使用Method handles来实现反射

这导致在添加一些新的特性时,比如Record,Sealed Class时,修改与支持它们的反射变得困难及麻烦。

因此,在JDK 18中,对反射的内部实现进行了重构,并且提高了性能。

5. Vector API (Third Incubator)

它是什么

Java Vector API (向量API)是用于支持计算机的矢量计算。

为什么需要这个特性

这个特性是Java支持向量处理。向量处理是一种更高效的系统级别的处理方式,它以流水线结构为主的进行并行处理,因此更高效。

6. Internet-Address Resolution SPI

它是什么

提供了对Java中网络地址解析自实现。比如InetAddress::getByNameInetAddress::getAllByName这些方法。

为什么需要这个特性

JDK对于网络地址解析,是通过查询系统的解析来实现的。在大多数场景下这已经足够了,但一些特别的场景下这会带来不可预知的问题。提供一套自实现的网络解析,这样某些业务场景下你可以编写更可靠的网络解析。

7. Foreign Function & Memory API (Second Incubator)

它是什么

提供了一套新的与外部程序打交道的API,用于替换过往的Java Native Interface(JNI)

为什么需要这个特性

当然是过往的JNI有很多缺点或不足了。简而言之,使用这套机制,它的优势在于:

  • 更易于使用
  • 足够的性能
  • 更通用
  • 更安全

如果你需要调用系统原生程序,过往你可能使用JNI来实现,未来你可以考虑这个特性。

8. Pattern Matching for switch (Second Preview)

它是什么

模式自动匹配对switch语句与表达式的支持。

为什么需要这个特性

JDK 17引进了Pattern Matching模式匹配,我在Java 8 之后的那些新特性(八):模式匹配 Pattern Matching讲述到这个特性。

但模式匹配的正式特性,JDK 17中只适用instanceof。所以,这个特性就是在switch语句以及表达式中,你也能用上匹配自动匹配了。

9. Deprecate Finalization for Removal

它是什么

Object对象有一个方法是finalize,它的作用是用于销毁当前对象所持有的资源。但这个方法有非常多的问题与缺点。因此JDK计划在未来移除掉它。 JDK 18将其标记为Deprecate,以便未来某个版本能移除掉它。

为什么需要这个特性

根据JDK的建议,任何资源释放,应该使用try-with-resources statementcleaners两种机制来实现,它们是更可靠与更易维护的实现方式。

以上就是JDK 18所有的新特性,现在你应该对JDK 18有大致的了解了吧。

JDK的进步是我们一点一滴都能感受到的。