javascript
SpringBoot 3.0最低版本要求的JDK 17,这几个新特性不能不知道
最近,有很多人在傳說 SpringBoot要出3.0的版本了,并且宣布不再支持 Java 8,最低要求是 Java 17了。
其實(shí),早在2021年9月份,關(guān)于 Spring Framework 6.0的消息出來的時(shí)候,Spring 官方就已經(jīng)明確了不會(huì)向下兼容,最低的 JDK 版本是 JDK 17。
2022年,Spring Framework 6.0和 SpringBoot 3.0都會(huì)推出,在此之前,Java社區(qū)很堅(jiān)挺,一直是"新版任你發(fā),我用Java 8",不管新版本怎么出,很少有人愿意升級(jí)。
這一次,Spring 直接來了個(gè)大招,跨過 JDK 8-16,直接升級(jí)到 JDK 17 ,不知道會(huì)對(duì) Java生態(tài)產(chǎn)生怎樣的影響。
為什么是 Java 17
這么多新版本的 JDK,而且2022年還會(huì)推出 JDK 18 和 JDK 19,為什么 Spring 選擇了 JDK 17呢。
主要是因?yàn)樗且粋€(gè) LTS版本,所謂 LTS,是 Long Term Support,也就是官方保證會(huì)長(zhǎng)期支持的版本。
從 JDK 誕生到現(xiàn)在,還在長(zhǎng)期支持的版本主要有 JDK 7、JDK 8 、JDK 11以及 JDK 17
這一次 Spring直接跨越了 JDK 11,升級(jí)到 JDK 17,主要的考慮應(yīng)該是因?yàn)镴DK 17有更多的新特性支持。
接下來我們介紹幾個(gè)新特性,這些新特性都是我們開發(fā)者息息相關(guān)的,或者說是會(huì)影響我們寫代碼的。
JDK 17 支持的新特性
這里所謂的新特性,不只是 JDK 17中新增的,而是 JDK 17和 JDK 8相比,新增的特性。
本地變量類型推斷
在Java 10之前版本中,我們想定義定義局部變量時(shí)。我們需要在賦值的左側(cè)提供顯式類型,并在賦值的右邊提供實(shí)現(xiàn)類型:
MyObject value = new MyObject();
在Java 10中,提供了本地變量類型推斷的功能,可以通過var聲明變量:
var value = new MyObject();
本地變量類型推斷將引入“var”關(guān)鍵字,而不需要顯式的規(guī)范變量的類型。
其實(shí),所謂的本地變量類型推斷,也是Java 10提供給開發(fā)者的語法糖。
雖然我們?cè)诖a中使用var進(jìn)行了定義,但是對(duì)于虛擬機(jī)來說他是不認(rèn)識(shí)這個(gè)var的,在java文件編譯成class文件的過程中,會(huì)進(jìn)行解糖,使用變量真正的類型來替代var(詳細(xì)信息可以參考:我反編譯了Java 10的本地變量類型推斷)
Switch 表達(dá)式
在JDK 12中引入了Switch表達(dá)式作為預(yù)覽特性。并在Java 13中修改了這個(gè)特性,引入了yield語句,用于返回值。
而在之后的Java 14中,這一功能正式作為標(biāo)準(zhǔn)功能提供出來。
在以前,我們想要在switch中返回內(nèi)容,還是比較麻煩的,一般語法如下:
int i;
在JDK13中使用以下語法:
int i = switch (x) {
或者
int i = switch (x) {
在這之后,switch中就多了一個(gè)關(guān)鍵字用于跳出switch塊了,那就是yield,他用于返回一個(gè)值。
和return的區(qū)別在于:return會(huì)直接跳出當(dāng)前循環(huán)或者方法,而yield只會(huì)跳出當(dāng)前switch塊。
Text Blocks
Java 13中提供了一個(gè)Text Blocks的預(yù)覽特性,并且在Java 14中提供了第二個(gè)版本的預(yù)覽。
text block,文本塊,是一個(gè)多行字符串文字,它避免了對(duì)大多數(shù)轉(zhuǎn)義序列的需要,以可預(yù)測(cè)的方式自動(dòng)格式化字符串,并在需要時(shí)讓開發(fā)人員控制格式。
我們以前從外部copy一段文本串到Java中,會(huì)被自動(dòng)轉(zhuǎn)義,如有一段以下字符串:
將其復(fù)制到Java的字符串中,會(huì)展示成以下內(nèi)容:
“\n” +
即被自動(dòng)進(jìn)行了轉(zhuǎn)義,這樣的字符串看起來不是很直觀,在JDK 13中,就可以使用以下語法了:
“”"
使用“”“作為文本塊的開始符和結(jié)束符,在其中就可以放置多行的字符串,不需要進(jìn)行任何轉(zhuǎn)義。看起來就十分清爽了。
如常見的SQL語句:
String query = “”"
看起來就比較直觀,清爽了。
Records
Java 14 中便包含了一個(gè)新特性:EP 359: Records,
Records的目標(biāo)是擴(kuò)展Java語言語法,Records為聲明類提供了一種緊湊的語法,用于創(chuàng)建一種類中是“字段,只是字段,除了字段什么都沒有”的類。
通過對(duì)類做這樣的聲明,編譯器可以通過自動(dòng)創(chuàng)建所有方法并讓所有字段參與hashCode()等方法。這是JDK 14中的一個(gè)預(yù)覽特性。
使用record關(guān)鍵字可以定義一個(gè)記錄:
record Person (String firstName, String lastName) {}
record 解決了使用類作為數(shù)據(jù)包裝器的一個(gè)常見問題。純數(shù)據(jù)類從幾行代碼顯著地簡(jiǎn)化為一行代碼。(詳見:Java 14 發(fā)布了,不使用”class”也能定義類了?還順手要干掉Lombok!)
封閉類
在Java 15之前,Java認(rèn)為"代碼重用"始終是一個(gè)終極目標(biāo),所以,一個(gè)類和接口都可以被任意的類實(shí)現(xiàn)或繼承。
但是,在很多場(chǎng)景中,這樣做是容易造成錯(cuò)誤的,而且也不符合物理世界的真實(shí)規(guī)律。
例如,假設(shè)一個(gè)業(yè)務(wù)領(lǐng)域只適用于汽車和卡車,而不適用于摩托車。
在Java中創(chuàng)建Vehicle抽象類時(shí),應(yīng)該只允許Car和Truck類擴(kuò)展它。
通過這種方式,我們希望確保在域內(nèi)不會(huì)出現(xiàn)誤用Vehicle抽象類的情況。
為了解決類似的問題,在Java 15中引入了一個(gè)新的特性——密閉。
想要定義一個(gè)密閉接口,可以將sealed修飾符應(yīng)用到接口的聲明中。然后,permit子句指定允許實(shí)現(xiàn)密閉接口的類:
public sealed interface Service permits Car, Truck {
以上代碼定義了一個(gè)密閉接口Service,它規(guī)定只能被Car和Truck兩個(gè)類實(shí)現(xiàn)。
與接口類似,我們可以通過使用相同的sealed修飾符來定義密閉類:
public abstract sealed class Vehicle permits Car, Truck {
通過密閉特性,我們定義出來的Vehicle類只能被Car和Truck繼承。
instanceof 模式匹配
instanceof是Java中的一個(gè)關(guān)鍵字,我們?cè)趯?duì)類型做強(qiáng)制轉(zhuǎn)換之前,會(huì)使用instanceof做一次判斷,例如:
if (animal instanceof Cat) {
Java 14帶來了改進(jìn)版的instanceof操作符,這意味著我們可以用更簡(jiǎn)潔的方式寫出之前的代碼例子:
if (animal instanceof Cat cat) {
我們都不難發(fā)現(xiàn)這種寫法大大簡(jiǎn)化了代碼,省略了顯式強(qiáng)制類型轉(zhuǎn)換的過程,可讀性也大大提高了。
switch 模式匹配
基于instanceof模式匹配這個(gè)特性,我們可以使用如下方式來對(duì)對(duì)象o進(jìn)行處理:
static String formatter(Object o) {
可以看到,這里使用了很多if-else,其實(shí),Java中給我們提供了一個(gè)多路比較的工具,那就是switch,而且從Java 14開始支持switch表達(dá)式,但switch的功能一直都是非常有限的。
在Java 17中,Java的工程師們擴(kuò)展了switch語句和表達(dá)式,使其可以適用于任何類型,并允許case標(biāo)簽中不僅帶有變量,還能帶有模式匹配。我們就可以更清楚、更可靠地重寫上述代碼,例如:
static String formatterPatternSwitch(Object o) {
可以看到,以上的switch處理的是一個(gè)Object類型,而且case中也不再是精確的值匹配,而是模式匹配了。
總結(jié)
以上,我們介紹了幾個(gè)從 JDK 9開始,一直到 JDK 17中的幾個(gè)能夠改變我們寫代碼的方式的新特性。其實(shí),眾多的版本中,還有一些其他的特性及優(yōu)化,我們沒有在這里一一展開。
大家感興趣的可以到 JDK 官網(wǎng)查看各個(gè)版本的新功能介紹。
隨著 Spring Framework 6 和 SpringBoot 3.0的推出,相信會(huì)有一些公司在新項(xiàng)目中采用新版本,那么 JDK 17勢(shì)必要被應(yīng)用到生產(chǎn)環(huán)境中。
以上這些特性,大多數(shù)都是對(duì)開發(fā)比較友好的,有機(jī)會(huì)的話可以應(yīng)用起來。
影響了幾十萬名Java開發(fā)者的“Java工程師成神之路”系列文章,相信作為Javaer的你肯定在網(wǎng)絡(luò)上刷到讀到過N次,很多人可能不知道作者Hollis是誰,但卻都熟知這份“Java工程師成神之路”。
在上市的這一個(gè)月的時(shí)間里,這本書,不僅一度沖上了京東計(jì)算機(jī)與互聯(lián)網(wǎng)圖書榜第一名,竟然還沖上了科技圖書榜的第一名。
關(guān)于內(nèi)容
這本書是《Java工程師成神之路》系列叢書的第一本——基礎(chǔ)篇,主要定位是幫助大家鞏固基礎(chǔ)的,書中囊括了我認(rèn)為一個(gè)高級(jí)開發(fā)工程師需要掌握的所有的Java核心知識(shí)。
里面的大部分內(nèi)容來源于以下幾個(gè)方面:
1、日常工作中遇到的一些線上問題的經(jīng)驗(yàn)總結(jié);如為什么不能修改serialVersionUID、為什么接口返回值中不能使用枚舉。
2、平常面試中我會(huì)問的一些高頻技術(shù)問題;如為什么HashMap要引入紅黑樹、如何在泛型是String的List中存放Integer對(duì)象。
3、我平常自己學(xué)習(xí)的一些筆記;如為什么FastJson頻繁曝出序列化漏洞、有了UTF-8為什么還需要GBK
4、工作中的一些好的代碼實(shí)踐;如為什么我不建議使用聲明式事務(wù)、如何通過自定義注解寫出優(yōu)秀的代碼
這本書是基于JDK 17編寫的,其中不僅涵蓋了新版本JDK的一些重要特性,也對(duì)一些歷史版本的一些改動(dòng)、變化等等做了詳盡的闡述,如JDK 6中substring的內(nèi)存泄漏問題、JDK 7 中switch是如何實(shí)現(xiàn)對(duì)String的支持的、JDK 8的中Stream如何優(yōu)雅使用、各個(gè)版本中的HashMap的優(yōu)化過程等等。
還介紹了JDK 9中的模塊化技術(shù)、JDK 10中的本地變量類型推斷、JDK 13中的text block、JDK 14中的record類型、以及JDK 16 – JDK 17中的模式匹配等等。
這本書和其他Java基礎(chǔ)類書籍最大的區(qū)別就是里面都是干貨。書中沒有那些概念性的描述、也沒有那些無用的代碼示例。更多的是通俗易懂的解讀、底層原理的分析等。可以說沒有任何廢話。。。
關(guān)于彩蛋
在書籍剛剛出版的時(shí)候,我給大家說這本書中有一個(gè)彩蛋,現(xiàn)在可以告訴大家這個(gè)彩蛋是什么了。
用出版社的老師們的話來說,這真是史無前例的。
這是一份我自己總結(jié)的Java工程師知識(shí)地圖,他有70cm*100cm這么大,里面囊括了一份完完整整的知識(shí)體系,方便大家進(jìn)行對(duì)照和參考。
如果你想知道Java開發(fā)都需要會(huì)哪些知識(shí)。如果你想構(gòu)建自己的知識(shí)體系。如果你想知道自己還有哪些東西不會(huì)。如果你想知道自己當(dāng)前處于哪個(gè)階段。
那這份知識(shí)體系,一定不能錯(cuò)過。
購(gòu)書福利
最后給廣大粉絲的優(yōu)惠肯定不能少!!!
大家可以通過下方的二維碼,或者點(diǎn)擊閱讀原文,直達(dá)京東下單購(gòu)買《深入理解Java核心技術(shù):寫給Java工程師的干貨筆記(基礎(chǔ)篇)》一書。
5折優(yōu)惠,原價(jià)138元,附贈(zèng)一份全棧的Java工程師知識(shí)地圖!
現(xiàn)在到手價(jià)只需69元!
轉(zhuǎn)發(fā)文章并留言,小編從留言中精選5名幸運(yùn)粉絲,免費(fèi)包郵送出一份“Java工程師知識(shí)地圖”助你全面掌握J(rèn)ava技術(shù)棧!
總結(jié)
以上是生活随笔為你收集整理的SpringBoot 3.0最低版本要求的JDK 17,这几个新特性不能不知道的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简述关于ASP.NET MVC与.NET
- 下一篇: [读书笔记]Spring中的容器设计详解