1. 前⾔
从springboot3.0开始,已经不⽀持JDK8了。
参考资料,来⾃官⽅博客:
https://spring.io/blog/2022/01/20/spring-boot-3-0-0-m1-is-now
available?spm=a2c6h.12873639.article-detail.24.766d46b40LM1IV
从3.0开始,转变为JDK17。
官⽅维护的版本都是SpringBoot3.X的了, 但是之前的版本也是可以⽤的, 只是官⽅不再进⾏功能更新了
综上所述,选⽤ Java 17,概括起来主要有下⾯⼏个主要原因
1.
JDK 17 是 LTS (⻓期⽀持版),可以免费商⽤到 2029 年。⽽且将前⾯⼏个过渡版(JDK 9-JDK 16)
去其糟粕,取其精华的版本;
2.
JDK 17 性能提升不少,⽐如重写了底层 NIO,⾄少提升 10% 起步;
3.
⼤多数第三⽅框架和库都已经⽀持,不会有什么⼤坑;
2. ⼀些新增的特性
2.1 yield关键字
yield关键字,从Java13开始引⼊。yield关键字⽤于从case的代码块中返回值。
正常的switch语句:
简化后的switch:
使用->指向符
如果不想使⽤指向符-> 可以使⽤yield来代替:
2.2 var关键字
从Java10开始,var被引⼊
上述代码中,编译器会⾃动推断出name是⼀个String类型,age是⼀个int类型。
为什么使⽤var?
使⽤var可以使代码更简洁。有时候,类型名称可能会⾮常⻓,例如泛型。var就像是⼀个简化器,让你不必反复写出繁琐的类型名
使⽤注意事项:
1. 不能使⽤var来声明字段
2. 不能使⽤var来声明⽅法参数
3. 不能使⽤var来声明⽅法返回类型
4. var声明变量必须初始化,但是不能初始化为null
class OrgCat {public var name; //errorpublic var eat ( var str) { //error}}public static void main (String[] args) {var complexMap2 = 10 ;System. out .println(complexMap2);var str = null ; //error}
2.3 空指针异常
出现异常的具体⽅法和原因都⼀⽬了然。如果你的⼀⾏代码中有多个⽅法、多个变量,可以快速定位问题所在,如果是 JDK1.8,有些情况下真的不太容易看出来。
JDK8:
JDK17:
2.4 密封类
密封类⼀般应⽤在类和接⼝中,对接⼝和类的实现和继承进⾏约束。主要使⽤的关键字是
final
。当这个类被 final
修饰了,被修饰的类就变成完全封闭的状态了,所有类都没办法继承。
JDK17提供了⼀个新的关键字:
sealed
.密封类除了可以被该关键字修饰,并且在声明末尾⽤
permits
表⽰要开放给哪些类型。
下述代码Animal 为密封类,然后使⽤
permits
关键字,把继承权限开放 给了Dog 类
重点总结:
1.
sealed修饰的类必须要有⼦类
提⽰:Sealed class must have subclasses,此时Dog 被 sealed 修饰,那么Dog 必须要有⼦类!!
2.
使⽤ non-sealed 关键字修饰。表⽰不限制,任何类都可以继承。
3.
未被
permits
允许的类型,则没办法继承
正确做法可以改为:
4.
复杂的特殊写法
2.5 接⼝中的私有⽅法
Java 8, 接⼝可以有默认⽅法。Java9之后,可以在接⼝内实现私有⽅法实现。
2.6 instanceof
⽐如以下常⻅的代码 :
上⾯的instanc of语法⼀共做了三件事:
1.
判断是否为String类型;
2.
如果是,转成String类型;
3.
创建⼀个名为str 的临时变量;
在JDK16中,使⽤模式匹配思想改进了instance of ⽤法,可以做到以下优化效果:
2.7 其他
其他还有很多未列举到的,⽐如:
1.
ZGC-新⼀代垃圾回收器、G1垃圾回收器相关等等
2.
record 类的使⽤
3.
Stream API的部分改进
4.
HttpClient
重写了,⽀持 HTTP2.0
5.
⽀持 List.of()、Set.of()、Map.of()和Map.ofEntries()等⼯⼚⽅法实例化对象
6.
等等更多的知识,期待大家去探索!