JDK 18已经在今年的3月22日正式发布了。它是一个非长期支持版的JDK。
我在这篇文章将简述一下JDK 18中有哪些新特性,以供大家参阅与了解。
由于JDK 18不是LTS版本的SDK,所以你可能不会真正去使用它,但做为Java程序员,我们仍然有义务去了解它有哪些新特性。
在开始之前,我希望再解释一个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是个非LTS版本,通常情况下,我们只会使用JDK LTS版本。但知道非LTS版本有哪些新特性,对我们Java程序员来说,也是非常有必要的。
JDK 18的新特性列表如下:
以下对每个特性的简述
本篇文章只是简述,我只会简单的描述这个特性是什么以及为什么需要这个特性,不会用代码详细的展示如何使用这个新特性。
它是什么
将JDK中的字符集编码,默认设置为UTF-8
为什么需要这个特性
过往,JDK的一些API中,比如读取文件使用的字符集依赖于操作系统。那就意味着在不同的操作系统,同一个API得到预期不一致的结果。
举例说明,很多国内Java程序员,都可能遇到过中文乱码问题,这种情况下我们会指定UTF-8做为编码集,以规避这个问题,但前提是你记得指定UTF-8编码。
现在,JDK 18解决了这个预期不一致的现象,这意味着在不指定编码集的情况下,不同的操作系统的代码仍然使用的是同一个字符集。这样强化了Java的可移植性。
它是什么
JDK 18提供了一个简单的WEB服务,支持静态网站的访问。它不支持JSP或Servlet等,也不支持访问权限控制,授权等任何高级特性。它只是一个简单的Web服务器
为什么需要这个特性
主要支持程序员用于原型展示,测试等场景的。
举例说明,我在编写后端API的同时,会使用OpenApi来编写标准的API文档给前端或移动端人员参考。在vert.x中,由于支持static router,所以我可以把这个API文档一同打包进JAR中,启动JAR就能访问到这个API文档,非常方便。
但在JDK中,以前是做不到的,只能另外将其部署到nginx中,现在有了这个特性,一样也能做到了。还是挺方便的。
不过要记住,它不能取代nginx,也不能取代tomcat等生产用的服务器。
它是什么
在Java doc中,以往你可以使用 @code
来嵌入一些代码片断,但它有一些不足。于是JDK 18提供了更好的@snippet
标签来让你在java doc中嵌入代码。
为什么需要这个特性
@code
有一些不足,比如不支持语法高亮;不被IDE识别为代码无法基于代码模式来编辑它,只被认为是普通文本;不支持HTML标签等。而@snippet
就是为了改善这些不足而出的。
它是什么
JDK 18重新实现了反射API背后的实现机制。这个特性是隐藏式特性,也就是你在JDK 18中使用反射的API, API并没有任何变化,但背后的实现更简洁与高效了
为什么需要这个特性
因为过往JDK对反射的实现并不优雅,JDK反射内部机制复杂,有三种不同的内部实现来支撑:
这导致在添加一些新的特性时,比如Record,Sealed Class时,修改与支持它们的反射变得困难及麻烦。
因此,在JDK 18中,对反射的内部实现进行了重构,并且提高了性能。
它是什么
Java Vector API (向量API)是用于支持计算机的矢量计算。
为什么需要这个特性
这个特性是Java支持向量处理。向量处理是一种更高效的系统级别的处理方式,它以流水线结构为主的进行并行处理,因此更高效。
它是什么
提供了对Java中网络地址解析自实现。比如InetAddress::getByName
,InetAddress::getAllByName
这些方法。
为什么需要这个特性
JDK对于网络地址解析,是通过查询系统的解析来实现的。在大多数场景下这已经足够了,但一些特别的场景下这会带来不可预知的问题。提供一套自实现的网络解析,这样某些业务场景下你可以编写更可靠的网络解析。
它是什么
提供了一套新的与外部程序打交道的API,用于替换过往的Java Native Interface(JNI)
为什么需要这个特性
当然是过往的JNI有很多缺点或不足了。简而言之,使用这套机制,它的优势在于:
如果你需要调用系统原生程序,过往你可能使用JNI来实现,未来你可以考虑这个特性。
它是什么
模式自动匹配对switch语句与表达式的支持。
为什么需要这个特性
JDK 17引进了Pattern Matching模式匹配,我在Java 8 之后的那些新特性(八):模式匹配 Pattern Matching讲述到这个特性。
但模式匹配的正式特性,JDK 17中只适用instanceof
。所以,这个特性就是在switch语句以及表达式中,你也能用上匹配自动匹配了。
它是什么
Object对象有一个方法是finalize,它的作用是用于销毁当前对象所持有的资源。但这个方法有非常多的问题与缺点。因此JDK计划在未来移除掉它。JDK 18将其标记为Deprecate,以便未来某个版本能移除掉它。
为什么需要这个特性
根据JDK的建议,任何资源释放,应该使用try-with-resources statement
或cleaners
两种机制来实现,它们是更可靠与更易维护的实现方式。
以上就是JDK 18所有的新特性,现在你应该对JDK 18有大致的了解了吧。
JDK的进步是我们一点一滴都能感受到的。
我是御剑,一个致力于追求,实践与传播编码之道的程序员。
访问微言码道
(https://taoofcoding.tech)以阅读更多我写的文章;
访问myddd
(https://myddd.org)以了解我在维护的全栈式领域驱动开源框架。