SpringBoot 3.0最低版本要求的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之前版本中,我们想定义定义局部变量时。我们需要在赋值的左侧提供显式类型,并在赋值的右边提供实现类型:在Java 10中,提供了本地变量类型推断的功能,可以通过var声明变量:MyObjectvalue=newMyObject();
本地变量类型推断将引入“var”关键字,而不需要显式的规范变量的类型。其实,所谓的本地变量类型推断,也是Java 10提供给开发者的语法糖。虽然我们在代码中使用var进行了定义,但是对于虚拟机来说他是不认识这个var的,在java文件编译成class文件的过程中,会进行解糖,使用变量真正的类型来替代var(详细信息可以参考:我反编译了Java 10的本地变量类型推断)Switch 表达式在JDK 12中引入了Switch表达式作为预览特性。并在Java 13中修改了这个特性,引入了yield语句,用于返回值。而在之后的Java 14中,这一功能正式作为标准功能提供出来。在以前,我们想要在switch中返回内容,还是比较麻烦的,一般语法如下:varvalue=newMyObject();
在JDK13中使用以下语法:inti;switch(x){case"1":i=1;break;case"2":i=2;break;default:i=x.length();break;}
或者inti=switch(x){case"1"->1;case"2"->2;default->{intlen=args[1].length();yieldlen;}};
在这之后,switch中就多了一个关键字用于跳出switch块了,那就是yield,他用于返回一个值。和return的区别在于:return会直接跳出当前循环或者方法,而yield只会跳出当前switch块。Text BlocksJava 13中提供了一个Text Blocks的预览特性,并且在Java 14中提供了第二个版本的预览。text block,文本块,是一个多行字符串文字,它避免了对大多数转义序列的需要,以可预测的方式自动格式化字符串,并在需要时让开发人员控制格式。我们以前从外部copy一段文本串到Java中,会被自动转义,如有一段以下字符串:inti=switch(x){case"1":yield1;case"2":yield2;default:{intlen=args[1].length();yieldlen;}};
将其复制到Java的字符串中,会展示成以下内容:Hello,world
即被自动进行了转义,这样的字符串看起来不是很直观,在JDK 13中,就可以使用以下语法了:"\n"+"
\n"+"Hello,world
\n"+"\n"+"\n";
使用“”“作为文本块的开始符和结束符,在其中就可以放置多行的字符串,不需要进行任何转义。看起来就十分清爽了。如常见的SQL语句:"""
Hello,world
""";
看起来就比较直观,清爽了。RecordsJava 14 中便包含了一个新特性:EP 359: Records,Records的目标是扩展Java语言语法,Records为声明类提供了一种紧凑的语法,用于创建一种类中是“字段,只是字段,除了字段什么都没有”的类。通过对类做这样的声明,编译器可以通过自动创建所有方法并让所有字段参与hashCode()等方法。这是JDK 14中的一个预览特性。使用record关键字可以定义一个记录:Stringquery="""SELECT`EMP_ID`,`LAST_NAME`FROM`EMPLOYEE_TB`WHERE`CITY`="INDIANAPOLIS"ORDERBY`EMP_ID`,`LAST_NAME`;""";
record 解决了使用类作为数据包装器的一个常见问题。纯数据类从几行代码显著地简化为一行代码。(详见:Java 14 发布了,不使用”class”也能定义类了?还顺手要干掉Lombok!)封闭类在Java 15之前,Java认为"代码重用"始终是一个终极目标,所以,一个类和接口都可以被任意的类实现或继承。但是,在很多场景中,这样做是容易造成错误的,而且也不符合物理世界的真实规律。例如,假设一个业务领域只适用于汽车和卡车,而不适用于摩托车。在Java中创建Vehicle抽象类时,应该只允许Car和Truck类扩展它。通过这种方式,我们希望确保在域内不会出现误用Vehicle抽象类的情况。为了解决类似的问题,在Java 15中引入了一个新的特性——密闭。想要定义一个密闭接口,可以将sealed修饰符应用到接口的声明中。然后,permit子句指定允许实现密闭接口的类:recordPerson(StringfirstName,StringlastName){}
以上代码定义了一个密闭接口Service,它规定只能被Car和Truck两个类实现。与接口类似,我们可以通过使用相同的sealed修饰符来定义密闭类:publicsealedinterfaceServicepermitsCar,Truck{}
通过密闭特性,我们定义出来的Vehicle类只能被Car和Truck继承。instanceof 模式匹配instanceof是Java中的一个关键字,我们在对类型做强制转换之前,会使用instanceof做一次判断,例如:publicabstractsealedclassVehiclepermitsCar,Truck{}
Java 14带来了改进版的instanceof操作符,这意味着我们可以用更简洁的方式写出之前的代码例子:if(animalinstanceofCat){Catcat=(Cat)animal;cat.miaow();}elseif(animalinstanceofDog){Dogdog=(Dog)animal;dog.bark();}
我们都不难发现这种写法大大简化了代码,省略了显式强制类型转换的过程,可读性也大大提高了。switch 模式匹配基于instanceof模式匹配这个特性,我们可以使用如下方式来对对象o进行处理:if(animalinstanceofCatcat){cat.miaow();}elseif(animalinstanceofDogdog){dog.bark();}
可以看到,这里使用了很多if-else,其实,Java中给我们提供了一个多路比较的工具,那就是switch,而且从Java 14开始支持switch表达式,但switch的功能一直都是非常有限的。在Java 17中,Java的工程师们扩展了switch语句和表达式,使其可以适用于任何类型,并允许case标签中不仅带有变量,还能带有模式匹配。我们就可以更清楚、更可靠地重写上述代码,例如:staticStringformatter(Objecto){Stringformatted="unknown";if(oinstanceofIntegeri){formatted=String.format("int%d",i);}elseif(oinstanceofLongl){formatted=String.format("long%d",l);}elseif(oinstanceofDoubled){formatted=String.format("double%f",d);}elseif(oinstanceofStrings){formatted=String.format("String%s",s);}returnformatted;}
可以看到,以上的switch处理的是一个Object类型,而且case中也不再是精确的值匹配,而是模式匹配了。总结以上,我们介绍了几个从 JDK 9开始,一直到 JDK 17中的几个能够改变我们写代码的方式的新特性。其实,众多的版本中,还有一些其他的特性及优化,我们没有在这里一一展开。大家感兴趣的可以到 JDK 官网查看各个版本的新功能介绍。随着 Spring Framework 6 和 SpringBoot 3.0的推出,相信会有一些公司在新项目中采用新版本,那么 JDK 17势必要被应用到生产环境中。以上这些特性,大多数都是对开发比较友好的,有机会的话可以应用起来。staticStringformatterPatternSwitch(Objecto){returnswitch(o){caseIntegeri->String.format("int%d",i);caseLongl->String.format("long%d",l);caseDoubled->String.format("double%f",d);caseStrings->String.format("String%s",s);default->o.toString();};}
技术交流群最近有很多人问,有没有读者交流群,想知道怎么加入。
最近我创建了一些群,大家可以加入。交流群都是免费的,只需要大家加入之后不要随便发广告,多多交流技术就好了。
目前创建了多个交流群,全国交流群、北上广杭深等各地区交流群、面试交流群、资源共享群等。
有兴趣入群的同学,可长按扫描下方二维码,一定要备注:全国 Or 城市 Or 面试 Or 资源,根据格式备注,可更快被通过且邀请进群。
▲长按扫描往期推荐
「中国加班第一楼」深圳科兴万人大撤离!拖主机带屏幕,程序员公交上写代码
快手公司厕所装坑位计时器,网友:再也不能带薪拉屎了!
Spring Boot官宣:正式弃用 Java 8
如果你喜欢本文,请长按二维码,关注Hollis.转发至朋友圈,是对我最大的支持。点个在看喜欢是一种感觉在看是一种支持↘↘↘
相关阅读
-
世界热推荐:今晚7:00直播丨下一个突破...
今晚19:00,Cocos视频号直播马上点击【预约】啦↓↓↓在运营了三年... -
NFT周刊|Magic Eden宣布支持Polygon网...
Block-986在NFT这样的市场,每周都会有相当多项目起起伏伏。在过去... -
环球今亮点!头条观察 | DeFi的兴衰与...
在比特币得到机构关注之后,许多财务专家预测世界将因为加密货币的... -
重新审视合作,体育Crypto的可靠关系才能双赢
Block-987即使在体育Crypto领域,人们的目光仍然集中在FTX上。随着... -
简讯:前端单元测试,更进一步
前端测试@2022如果从2014年Jest的第一个版本发布开始计算,前端开发... -
焦点热讯:刘强东这波操作秀
近日,刘强东发布京东全员信,信中提到:自2023年1月1日起,逐步为...