51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

JDK 新特性

# JDK 新特性 {#%23-jdk-%E6%96%B0%E7%89%B9%E6%80%A7}

1. 引入模块 {#1.-%E5%BC%95%E5%85%A5%E6%A8%A1%E5%9D%97}

  Java 9 开始引入了模块(Module),目的是为了管理依赖。使用模块可以按需打包 JRE 和进一步限制类的访问权限。

2. 接口支持私有方法 {#2.-%E6%8E%A5%E5%8F%A3%E6%94%AF%E6%8C%81%E7%A7%81%E6%9C%89%E6%96%B9%E6%B3%95}

  JAVA 9 开始,接口里可以添加私有方法,JAVA 8 对接口增加了默认方法的支持,在 JAVA 9 中对该功能又来了一次升级,现在可以在接口里定义私有方法,然后在默认方法里调用接口的私有方法。这样一来,既可以重用私有方法里的代码,又可以不公开代码。

3. 匿名内部类支持钻石(diamond)运算符 {#3.-%E5%8C%BF%E5%90%8D%E5%86%85%E9%83%A8%E7%B1%BB%E6%94%AF%E6%8C%81%E9%92%BB%E7%9F%B3%EF%BC%88diamond%EF%BC%89%E8%BF%90%E7%AE%97%E7%AC%A6}

  JAVA 5 就引入了泛型(generic),到了 JAVA 7 开始支持钻石(diamond)运算符:<>,可以自动推断泛型的类型;但是这个自动推断类型的钻石运算符不支持匿名内部类,在 JAVA 9 中也对匿名内部类做了支持。

4. 增强的 try-with-resources {#4.-%E5%A2%9E%E5%BC%BA%E7%9A%84-try-with-resources}

  JAVA 7 中增加了try-with-resources的支持,可以自动关闭资源,但需要声明多个资源变量时,需要在 try 中写多个变量的创建过程,JAVA 9 中对这个功能进行了增强,可以引用 try 代码块之外的变量来自动关闭。

5. 弃用 new Integer() {#5.-%E5%BC%83%E7%94%A8-new-integer()}

  JAVA 9 开始弃用了 new Integer() 的方式来创建 Integer 对象,推荐通过静态工厂 Integer.valueOf() 的方式来替代,其它包装类类似。

6. 局部变量的自动类型推断(var) {#6.-%E5%B1%80%E9%83%A8%E5%8F%98%E9%87%8F%E7%9A%84%E8%87%AA%E5%8A%A8%E7%B1%BB%E5%9E%8B%E6%8E%A8%E6%96%AD%EF%BC%88var%EF%BC%89}

  JAVA 10 带来了一个很有意思的语法 - var,它可以自动推断局部变量的类型,以后再也不用写类型了,也不用靠 lombok 的 var 注解增强了,不过这个只是语法糖,编译后变量还是有类型的,使用时还是考虑下可维护性的问题,不然写多了可就成 JavaScript 风格了。

7. Lambda 中的自动类型推断(var) {#7.-lambda-%E4%B8%AD%E7%9A%84%E8%87%AA%E5%8A%A8%E7%B1%BB%E5%9E%8B%E6%8E%A8%E6%96%AD%EF%BC%88var%EF%BC%89}

  JAVA 11 中对 Lambda 语法也支持了 var 这个自动类型推断的变量,通过 var 变量还可以增加额外的注解。

8. java 命令增强 {#8.-java-%E5%91%BD%E4%BB%A4%E5%A2%9E%E5%BC%BA}

  以前编译一个 java 文件时,需要先 javac 编译为 class,然后再用 java 执行,JAVA 11 之后可以直接使用 java 命令。

9. Java Flight Recorder 开源 {#9.-java-flight-recorder-%E5%BC%80%E6%BA%90}

  「Java Flight Recorder」 是个非常好用的调试诊断工具,不过之前是在 Oracle JDK 中, JAVA 11 后就开源了,OpenJDK 现在也可以用这个功能。

10. 更简洁的 switch 语法 {#10.-%E6%9B%B4%E7%AE%80%E6%B4%81%E7%9A%84-switch-%E8%AF%AD%E6%B3%95}

  JAVA 12 和 13 分别增强了 switch 的语法。

11. instanceof 增强 {#11.-instanceof-%E5%A2%9E%E5%BC%BA}

  之前处理动态类型碰上要强转时,需要先 instanceof 判断一下,然后再强转为该类型处理,JAVA 12 之后 instanceof 支持直接类型转换了,不需要再来一次额外的强转。

12. 文本块(Text Block)的支持 {#12.-%E6%96%87%E6%9C%AC%E5%9D%97%EF%BC%88text-block%EF%BC%89%E7%9A%84%E6%94%AF%E6%8C%81}

  JAVA 13 中帮你解决了大段带换行符的字符串报文的问题,增加了文本块(""")的支持,可以不通过换行符换行拼字符串,而且不需要转义特殊字符,就像用模板一样。

13. 新增 record 类型 {#13.-%E6%96%B0%E5%A2%9E-record-%E7%B1%BB%E5%9E%8B}

  JAVA 14 新增 record 类型,干掉复杂的 POJO 类,一般我们创建一个 POJO 类,需要定义属性列表,构造函数,getter/setter方法,比较麻烦,JAVA 14 为我们带来了一个便捷的创建类的方式 - record。

  不过这个只是一个语法糖,编译后还是一个 Class,和普通的 Class 区别不大。

14. 更直观的 NullPointerException 提示 {#14.-%E6%9B%B4%E7%9B%B4%E8%A7%82%E7%9A%84-nullpointerexception-%E6%8F%90%E7%A4%BA}

  JAVA 14 优化了 NullPointerException 的提示,让你更容易定位到哪个对象为空。

15. 新增 jpackage 打包工具 {#15.-%E6%96%B0%E5%A2%9E-jpackage-%E6%89%93%E5%8C%85%E5%B7%A5%E5%85%B7}

  JAVA 14 新增 jpackage 打包工具,可以直接打包二进制程序,再也不用装 JRE 了。

  之前如果想构建一个可执行的程序,还需要借助三方工具,将 JRE 一起打包,或者让客户电脑也装一个 JRE 才可以运行我们的 JAVA 程序。

  现在 JAVA 直接内置了 jpackage 打包工具,帮助你一键打包二进制程序包。

16. 新增封闭(Sealed )类 {#16.-%E6%96%B0%E5%A2%9E%E5%B0%81%E9%97%AD%EF%BC%88sealed-%EF%BC%89%E7%B1%BB}

  JAVA 的继承目前只能选择允许继承和不允许继承(final 修饰),JAVA 15 新增了一个封闭(Sealed )类的特性,可以指定某些类才可以继承。

17. 新增垃圾回收器 {#17.-%E6%96%B0%E5%A2%9E%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E5%99%A8}

  JAVA 15 中,两款垃圾回收器ZGC 和 Shenandoah 正式登陆(默认 G1 ),性能更强,延迟更低。

注:Spring Framework 6 和 Spring Boot 3 的应用程序运行时至少需要JDK 17。

赞(0)
未经允许不得转载:工具盒子 » JDK 新特性