最近,有很多人在传说 SpringBoot要出3.0的版本了,并且宣布不再支持 Java 8,最低要求是 Java 17了。
其实,早在2021年9月份,关于 Spring Framework 6.0的消息出来的时候,Spring 官方就已经明确了不会向下兼容,最低的 JDK 版本是 JDK 17。

2022年,Spring Framework 6.0和 SpringBoot 3.0都会推出,在此之前,Java社区很坚挺,一直是"新版任你发,我用Java 8",不管新版本怎么出,很少有人愿意升级。

这一次,Spring 直接来了个大招,跨过 JDK 8-16,直接升级到 JDK 17 ,不知道会对 Java生态产生怎样的影响。

为什么是 Java 17
这么多新版本的 JDK,而且2022年还会推出 JDK 18 和 JDK 19,为什么 Spring 选择了 JDK 17呢。
主要是因为他是一个 LTS版本,所谓 LTS,是 Long Term Support,也就是官方保证会长期支持的版本。
从 JDK 诞生到现在,还在长期支持的版本主要有 JDK 7、JDK 8 、JDK 11以及 JDK 17

这一次 Spring直接跨越了 JDK 11,升级到 JDK 17,主要的考虑应该是因为JDK 17有更多的新特性支持。

接下来我们介绍几个新特性,这些新特性都是我们开发者息息相关的,或者说是会影响我们写代码的。

JDK 17 支持的新特性
这里所谓的新特性,不只是 JDK 17中新增的,而是 JDK 17和 JDK 8相比,新增的特性。
本地变量类型推断
在Java 10之前版本中,我们想定义定义局部变量时。我们需要在赋值的左侧提供显式类型,并在赋值的右边提供实现类型:
MyObject value = new MyObject();

在Java 10中,提供了本地变量类型推断的功能,可以通过var声明变量:
var value = new MyObject();

本地变量类型推断将引入“var”关键字,而不需要显式的规范变量的类型。
其实,所谓的本地变量类型推断,也是Java 10提供给开发者的语法糖。
虽然我们在代码中使用var进行了定义,但是对于虚拟机来说他是不认识这个var的,在java文件编译成class文件的过程中,会进行解糖,使用变量真正的类型来替代var(详细信息可以参考:我反编译了Java 10的本地变量类型推断)
Switch 表达式
在JDK 12中引入了Switch表达式作为预览特性。并在Java 13中修改了这个特性,引入了yield语句,用于返回值。
而在之后的Java 14中,这一功能正式作为标准功能提供出来。
在以前,我们想要在switch中返回内容,还是比较麻烦的,一般语法如下:
int i;

switch (x) {case "1":i=1;break;case "2":i=2;break;default:i = x.length();break;}

在JDK13中使用以下语法:
int i = switch (x) {

    case "1" -> 1;case "2" -> 2;default -> {int len = args[1].length();yield len;}};

或者
int i = switch (x) {

    case "1": yield 1;case "2": yield 2;default: {int len = args[1].length();yield len;}};

在这之后,switch中就多了一个关键字用于跳出switch块了,那就是yield,他用于返回一个值。
和return的区别在于:return会直接跳出当前循环或者方法,而yield只会跳出当前switch块。
Text Blocks
Java 13中提供了一个Text Blocks的预览特性,并且在Java 14中提供了第二个版本的预览。
text block,文本块,是一个多行字符串文字,它避免了对大多数转义序列的需要,以可预测的方式自动格式化字符串,并在需要时让开发人员控制格式。
我们以前从外部copy一段文本串到Java中,会被自动转义,如有一段以下字符串:

  <body><p>Hello, world</p></body></html>

将其复制到Java的字符串中,会展示成以下内容:
“\n” +

"    <body>\n" +"        <p>Hello, world</p>\n" +"    </body>\n" +"</html>\n";

即被自动进行了转义,这样的字符串看起来不是很直观,在JDK 13中,就可以使用以下语法了:
“”"

<html><body><p>Hello, world</p></body></html>""";

使用“”“作为文本块的开始符和结束符,在其中就可以放置多行的字符串,不需要进行任何转义。看起来就十分清爽了。
如常见的SQL语句:
String query = “”"

    SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`WHERE `CITY` = 'INDIANAPOLIS'ORDER BY `EMP_ID`, `LAST_NAME`;""";

看起来就比较直观,清爽了。
Records
Java 14 中便包含了一个新特性:EP 359: Records,
Records的目标是扩展Java语言语法,Records为声明类提供了一种紧凑的语法,用于创建一种类中是“字段,只是字段,除了字段什么都没有”的类。
通过对类做这样的声明,编译器可以通过自动创建所有方法并让所有字段参与hashCode()等方法。这是JDK 14中的一个预览特性。
使用record关键字可以定义一个记录:
record Person (String firstName, String lastName) {}

record 解决了使用类作为数据包装器的一个常见问题。纯数据类从几行代码显著地简化为一行代码。(详见:Java 14 发布了,不使用”class”也能定义类了?还顺手要干掉Lombok!)
封闭类
在Java 15之前,Java认为"代码重用"始终是一个终极目标,所以,一个类和接口都可以被任意的类实现或继承。
但是,在很多场景中,这样做是容易造成错误的,而且也不符合物理世界的真实规律。
例如,假设一个业务领域只适用于汽车和卡车,而不适用于摩托车。
在Java中创建Vehicle抽象类时,应该只允许Car和Truck类扩展它。
通过这种方式,我们希望确保在域内不会出现误用Vehicle抽象类的情况。
为了解决类似的问题,在Java 15中引入了一个新的特性——密闭。
想要定义一个密闭接口,可以将sealed修饰符应用到接口的声明中。然后,permit子句指定允许实现密闭接口的类:
public sealed interface Service permits Car, Truck {

}

以上代码定义了一个密闭接口Service,它规定只能被Car和Truck两个类实现。
与接口类似,我们可以通过使用相同的sealed修饰符来定义密闭类:
public abstract sealed class Vehicle permits Car, Truck {

}

通过密闭特性,我们定义出来的Vehicle类只能被Car和Truck继承。
instanceof 模式匹配
instanceof是Java中的一个关键字,我们在对类型做强制转换之前,会使用instanceof做一次判断,例如:
if (animal instanceof Cat) {

    Cat cat = (Cat) animal;cat.miaow();} else if (animal instanceof Dog) {Dog dog = (Dog) animal;dog.bark();}

Java 14带来了改进版的instanceof操作符,这意味着我们可以用更简洁的方式写出之前的代码例子:
if (animal instanceof Cat cat) {

    cat.miaow();} else if(animal instanceof Dog dog) {dog.bark();}

我们都不难发现这种写法大大简化了代码,省略了显式强制类型转换的过程,可读性也大大提高了。
switch 模式匹配
基于instanceof模式匹配这个特性,我们可以使用如下方式来对对象o进行处理:
static String formatter(Object o) {

    String formatted = "unknown";if (o instanceof Integer i) {formatted = String.format("int %d", i);} else if (o instanceof Long l) {formatted = String.format("long %d", l);} else if (o instanceof Double d) {formatted = String.format("double %f", d);} else if (o instanceof String s) {formatted = String.format("String %s", s);}return formatted;}

可以看到,这里使用了很多if-else,其实,Java中给我们提供了一个多路比较的工具,那就是switch,而且从Java 14开始支持switch表达式,但switch的功能一直都是非常有限的。
在Java 17中,Java的工程师们扩展了switch语句和表达式,使其可以适用于任何类型,并允许case标签中不仅带有变量,还能带有模式匹配。我们就可以更清楚、更可靠地重写上述代码,例如:
static String formatterPatternSwitch(Object o) {

    return switch (o) {case Integer i -> String.format("int %d", i);case Long l    -> String.format("long %d", l);case Double d  -> String.format("double %f", d);case String s  -> String.format("String %s", s);default        -> o.toString();};}

可以看到,以上的switch处理的是一个Object类型,而且case中也不再是精确的值匹配,而是模式匹配了。

总结
以上,我们介绍了几个从 JDK 9开始,一直到 JDK 17中的几个能够改变我们写代码的方式的新特性。其实,众多的版本中,还有一些其他的特性及优化,我们没有在这里一一展开。
大家感兴趣的可以到 JDK 官网查看各个版本的新功能介绍。
随着 Spring Framework 6 和 SpringBoot 3.0的推出,相信会有一些公司在新项目中采用新版本,那么 JDK 17势必要被应用到生产环境中。
以上这些特性,大多数都是对开发比较友好的,有机会的话可以应用起来。

影响了几十万名Java开发者的“Java工程师成神之路”系列文章,相信作为Javaer的你肯定在网络上刷到读到过N次,很多人可能不知道作者Hollis是谁,但却都熟知这份“Java工程师成神之路”。

在上市的这一个月的时间里,这本书,不仅一度冲上了京东计算机与互联网图书榜第一名,竟然还冲上了科技图书榜的第一名。

关于内容

这本书是《Java工程师成神之路》系列丛书的第一本——基础篇,主要定位是帮助大家巩固基础的,书中囊括了我认为一个高级开发工程师需要掌握的所有的Java核心知识。

里面的大部分内容来源于以下几个方面:

1、日常工作中遇到的一些线上问题的经验总结;如为什么不能修改serialVersionUID、为什么接口返回值中不能使用枚举。

2、平常面试中我会问的一些高频技术问题;如为什么HashMap要引入红黑树、如何在泛型是String的List中存放Integer对象。

3、我平常自己学习的一些笔记;如为什么FastJson频繁曝出序列化漏洞、有了UTF-8为什么还需要GBK

4、工作中的一些好的代码实践;如为什么我不建议使用声明式事务、如何通过自定义注解写出优秀的代码

这本书是基于JDK 17编写的,其中不仅涵盖了新版本JDK的一些重要特性,也对一些历史版本的一些改动、变化等等做了详尽的阐述,如JDK 6中substring的内存泄漏问题、JDK 7 中switch是如何实现对String的支持的、JDK 8的中Stream如何优雅使用、各个版本中的HashMap的优化过程等等。

还介绍了JDK 9中的模块化技术、JDK 10中的本地变量类型推断、JDK 13中的text block、JDK 14中的record类型、以及JDK 16 – JDK 17中的模式匹配等等。

这本书和其他Java基础类书籍最大的区别就是里面都是干货。书中没有那些概念性的描述、也没有那些无用的代码示例。更多的是通俗易懂的解读、底层原理的分析等。可以说没有任何废话。。。

关于彩蛋

在书籍刚刚出版的时候,我给大家说这本书中有一个彩蛋,现在可以告诉大家这个彩蛋是什么了。

用出版社的老师们的话来说,这真是史无前例的。

这是一份我自己总结的Java工程师知识地图,他有70cm*100cm这么大,里面囊括了一份完完整整的知识体系,方便大家进行对照和参考。

如果你想知道Java开发都需要会哪些知识。如果你想构建自己的知识体系。如果你想知道自己还有哪些东西不会。如果你想知道自己当前处于哪个阶段。

那这份知识体系,一定不能错过。

购书福利

最后给广大粉丝的优惠肯定不能少!!!

大家可以通过下方的二维码,或者点击阅读原文,直达京东下单购买《深入理解Java核心技术:写给Java工程师的干货笔记(基础篇)》一书。

5折优惠,原价138元,附赠一份全栈的Java工程师知识地图!

现在到手价只需69元!

转发文章并留言,小编从留言中精选5名幸运粉丝,免费包邮送出一份“Java工程师知识地图”助你全面掌握Java技术栈!

SpringBoot 3.0最低版本要求的JDK 17,这几个新特性不能不知道相关推荐

  1. SpringBoot 3.0最低版本要求的JDK 17,这几个新特性不能不知道!

    △Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 387 篇原创分享 作者 l Hollis 来源 l Hollis(ID:hollischuang) 最近,有很多人在传说 ...

  2. 直播 | RT-Thread 4.0.4 版本代码 Release啦!一起来参与新特性解读会吧~

    时光如梭,离RT-Thread 4.0.3 版本的发布已有一段时间了. 今天,我们RT-Thread 4.0.4 版本代码终于Release啦! 细数这一年的变化,真的很多! 内核方面,我们对 IPC ...

  3. 微信投屏服务器出错,微信发布7.0.21版本,修复异常问题,增加超实用新功能

    原标题:微信发布7.0.21版本,修复异常问题,增加超实用新功能 iOS微信又更新了,今天发布v7.0.21版本,距离上次更新才两个礼拜的时间.以往微信的更新频率是比较慢的,这次之所以如此之快地发布新 ...

  4. JDK 16 昨日正式发布,新特性实践尝鲜来啦!

    JDK 16在2021年2月18日已完成最终候选版本,并于2021年3月16日正式发布.和JDK 15一样,JDK 16也会是一个短期版本,仅支持六个月.而计划在2021年9月发布的JDK 17将会是 ...

  5. JDK 15 JAVA 15的新特性展望

    文章目录 JEP 371: Hidden Classes JEP 372: 删除 Nashorn JavaScript Engine JEP 377: 新的垃圾回收器ZGC正式上线了 JEP 378: ...

  6. tomcat7.0支持什么版本的jdk_JDK/Java 16 可能带来什么新特性?

    点击"蓝字"关注我们吧 JDK 15 已于今年 9 月 15 日发布,这是一个短期版本,只会受到 Oracle 6 个月的支持.JDK 16 将作为标准 Java 版本的参考实现在 ...

  7. JDK 10 的 109 项新特性

    来源:开源中国, www.oschina.net/translate/109-new-features-in-jdk-10 虽然感觉 JDK9 发布才仅仅几周的时间,然而,随着新的 OpenJDK 的 ...

  8. JDK/Java 17 可能带来什么新特性?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 JDK/Java ...

  9. 最好的浏览器排行榜_PG是最好的数据库;TiDB 4.0前瞻;SequoiaDB高可用原理;20c DG新特性... 数据库周刊第18期...

    热门资讯 1. 2020年4月数据库流行度排行:MySQL 成事实王者,国产openGauss引期待 [摘要]2020年4月 DB-Engines 数据库流行度排行出炉.在本月的排行榜上,Oracle ...

  10. MongoDB 5.0 来了,原生时序、版本化 API 新特性悉数登场

    作者 | 伍杏玲 出品 | CSDN云计算(ID:CSDNcloud) 据 DB-Engines 数据库最新 7 月流行度排行榜显示,前五名十分稳定:Oracle.MySQL.Microsoft SQ ...

最新文章

  1. linux系统安装mysql
  2. CF-786B(Legacy) 区间最短路
  3. 【luogu P1343 地震逃生】 题解
  4. 那些你从未见过的神奇物理化学实验,今天全给你整理了!
  5. Python和Java结合的项目实战_[项目实战] Python高级教程项目实战篇 Python和Java结合的项目实战 视频教程 [...
  6. 5 批量更新多条记录_如何使用 F12 开发者工具自动批量删除新浪微博
  7. Zabbix监控Oracle 连接数
  8. matlab 风机 功率曲线,风力发电机功率曲线统计MATLAB代码实现.docx
  9. android打印处理服务已停止,Print Spooler服务停止 打印机服务无法启动的完美解决方案共享...
  10. android实现模拟微信调用相机和手机图库更换头像
  11. Springboot中temlates和static
  12. win10计算机怎么拨号上网,win10如何设置宽带拨号连接
  13. 外地人在成都买房被限购怎么办?看完就知道
  14. nginx 配置443端口
  15. 基于Milton的webdav解决方案 - Test
  16. ClickHouse快速安装-可视化工具连接-创建第一个ck库表(一)
  17. 锐龙r74800h和i710750h差距大吗 r74800h和i710750h对比
  18. 微信小程序轮播图swiper详细代码介绍
  19. powerdesinger 批量修改表前缀
  20. UE5学习笔记——前言

热门文章

  1. HTTPClient模拟登陆开心网001
  2. layer的move要怎么用
  3. pythonwin7下载教程_如何在win7下安装Python及配置!python win7下载教程
  4. ubuntu安装pr_Ubuntu 18.04 安装 Openbravo-3.0PR19Q1
  5. C网跟G网是什么意思?
  6. js按钮触发网页提醒_js实现按钮点击事件 在页面上点击函数,查看执行效果
  7. word怎么让页码在指定页面从1开始
  8. 极光推送java添加用户_极光推送 java集成
  9. unll是什么意思_javascript中null是什么意思?
  10. UTC时间与北京时间和纽约的时间