我們?cè)凇?018 編程語(yǔ)言流行度大調(diào)查》中談到瞒窒,在用戶最喜愛和最關(guān)注的編程語(yǔ)言中,Java獨(dú)領(lǐng)風(fēng)騷乡洼。其中崇裁,Java 9關(guān)注度不斷上升匕坯,62% 的人希望在 2018 年更多地關(guān)注 Java 9,此外有三分之一的參與者表示對(duì)即將到來(lái)的Java 10 和 11版本很感興趣拔稳。
在過(guò)去的一年中Java經(jīng)歷了一段時(shí)間的動(dòng)蕩葛峻,今年Java又有什么新進(jìn)展呢?本文讓我們一起來(lái)看看Java的狀況吧巴比。
以下為譯文:
2017年是Java界最動(dòng)蕩的一年泞歉。期待已久的Java 9帶來(lái)了許多的變化和有趣的新功能,同時(shí)Oracle也宣布了JDK最新的發(fā)布時(shí)間表匿辩。而這一切只是個(gè)開始腰耙。過(guò)去開發(fā)人員常常抱怨Java的發(fā)展速度不夠快。我認(rèn)為這些抱怨將在不久的將來(lái)消失铲球,甚至有可能帶來(lái)意外的驚喜挺庞。
從2018年開始,JDK建立了全新的發(fā)布時(shí)間表稼病。以前一次大的版本升級(jí)需要等好幾年选侨,現(xiàn)在則縮短為每隔6個(gè)月發(fā)布一次小版本。繼2017年9月Java 9發(fā)布之后然走,Java 10將在2018年3月發(fā)布援制,以及之后更多的新版本都將很快到來(lái)。
歡迎工作一到五年的Java工程師朋友們加入Java技術(shù)交流:611481448
群內(nèi)提供免費(fèi)的Java架構(gòu)學(xué)習(xí)資料(里面有高可用芍瑞、高并發(fā)晨仑、高性能及分布式、Jvm性能調(diào)優(yōu)拆檬、Spring源碼洪己,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個(gè)知識(shí)點(diǎn)的架構(gòu)資料)合理利用自己每一分每一秒的時(shí)間來(lái)學(xué)習(xí)提升自己竟贯,不要再用"沒有時(shí)間“來(lái)掩飾自己思想上的懶惰答捕!趁年輕,使勁拼屑那,給未來(lái)的自己一個(gè)交代拱镐!
企業(yè)技術(shù)棧概覽
大多數(shù)企業(yè)項(xiàng)目不僅使用JDK,還依賴一系列的企業(yè)級(jí)函數(shù)庫(kù)持际,如Spring Boot沃琅、Java EE等,而這些函數(shù)庫(kù)也將在接下來(lái)幾個(gè)月中得到升級(jí)选酗。我將在本文中重點(diǎn)討論JDK阵难,但是首先讓我們來(lái)看看Java界中兩個(gè)主要的企業(yè)技術(shù)棧將有哪些變化岳枷。
Spring開發(fā)團(tuán)隊(duì)正在努力開發(fā)Spring Boot 2芒填,并在今年1月份發(fā)布了第一個(gè)RC版本呜叫。該團(tuán)隊(duì)并沒有在API方面做出重大的變化,也不打算在最終版本發(fā)布之前添加任何新功能殿衰。所以朱庆,如果你的項(xiàng)目中用到了Spring Boot,那么最好現(xiàn)在仔細(xì)研究新版本闷祥,并開始計(jì)劃現(xiàn)有Spring Boot應(yīng)用程序的更新娱颊。
在2017年年底,Oracle將Java EE標(biāo)準(zhǔn)移交給了由Eclipse基金會(huì)管理的EE4J項(xiàng)目凯砍。正如大家所料箱硕,移交這樣的一個(gè)大項(xiàng)目不可能在幾天內(nèi)完成,其中有很多組織和技術(shù)方面的工作需要完成悟衩。Java EE需要一個(gè)新名字并建立全新的開發(fā)流程剧罩。另一方面,保存在各種bug跟蹤工具中的源代碼和二進(jìn)制文件的移交仍在進(jìn)行中座泳。開發(fā)者還需要等待很長(zhǎng)一段時(shí)間惠昔,才能看到此次移交帶來(lái)的效果,以及更強(qiáng)大的社區(qū)參與挑势。
縮短JDK的發(fā)布和支持周期
Oracle去年宣布將在2018年內(nèi)發(fā)布兩個(gè)新的JDK版本镇防。以往Oracle一貫秉承緩慢的版本發(fā)布節(jié)奏,每隔幾年才發(fā)布一個(gè)主版本潮饱,其中包含大量的變化来氧,從今年起將改為每6個(gè)月發(fā)布一個(gè)較小的版本。這一變化可以加速Java平臺(tái)的創(chuàng)新香拉,還可以降低Java更新帶來(lái)的風(fēng)險(xiǎn)饲漾。而Java開發(fā)人員可以更加容易地熟悉小版本的最新變化,并將其應(yīng)用到項(xiàng)目中缕溉。
我認(rèn)為這對(duì)Java界是個(gè)非常積極的改變考传,它將為Java語(yǔ)言的開發(fā)增添新動(dòng)力,JDK團(tuán)隊(duì)也可以更快地適應(yīng)和創(chuàng)新证鸥。
JDK 10帶來(lái)的變化和新功能
由于發(fā)布周期較短僚楞,Java 10只包含少量的變化。請(qǐng)參照OpenJDK網(wǎng)站公布的有關(guān)JDK 10的最新消息(http://openjdk.java.net/projects/jdk/10/)枉层,其中包含12個(gè)JEP(JDK Enhancement Proposal泉褐,JDK改進(jìn)提案)。
其中最值得一提的變化是局部變量的類型推斷(JEP 286鸟蜡,http://openjdk.java.net/jeps/286)膜赃。其次你應(yīng)該了解下新增的基于時(shí)間的版本命名方式(JEP 322,http://openjdk.java.net/jeps/322)揉忘,以及G1(或稱Garbage First垃圾收集器)開始支持并行Full GC(JEP 307跳座,http://openjdk.java.net/jeps/307)端铛。
類型推斷
JDK 10終于引入了類型推斷。許多其他靜態(tài)類型語(yǔ)言很早就已經(jīng)支持這個(gè)功能了疲眷,眾多Java開發(fā)人員一直希望引入這項(xiàng)功能禾蚕。
JEP 286引入了關(guān)鍵字var,簡(jiǎn)化了局部變量的聲明狂丝,并由編譯器根據(jù)初始化代碼推斷變量的類型换淆。以往我們必須寫:
List paramNames = List.of("host.name","host.port");Configuration config = initializeConfig(paramNames);
現(xiàn)在可以簡(jiǎn)化為:
var paramNames = List.of("host.name","host.port");var config = initializeConfig(paramNames);
以上代碼中,關(guān)鍵字var替代了冗長(zhǎng)的變量聲明几颜。這可以增加代碼的閱讀性倍试,特別在代碼有合理的變量命名規(guī)則,并且變量?jī)H在聲明后使用幾次的情況下尤為明顯蛋哭。
如果想更深入地了解JEP 286以及使用方法易猫,可以參照Nicolai Parlog的這篇文章:https://blog.codefx.org/java/java-10-var-type-inference/。
基于時(shí)間的版本命名方式
從Java 10開始具壮,Java的版本號(hào)格式將發(fā)生變化准颓,以更好地支持基于時(shí)間的發(fā)布方式。
新的發(fā)布方式帶來(lái)的最大難點(diǎn)在于:版本的實(shí)際內(nèi)容可能發(fā)生變化棺妓。由于開始時(shí)唯一可以確定的只有新版本的發(fā)布時(shí)間攘已,所以如果新功能的開發(fā)時(shí)間比預(yù)期長(zhǎng),無(wú)法在新版本發(fā)布時(shí)完成怜跑,就不能進(jìn)入新版本样勃。因此版本號(hào)需要以時(shí)間點(diǎn)為準(zhǔn),而非版本內(nèi)包含的變更內(nèi)容性芬。
JEP 322定義的版本號(hào)格式為:$ 功能號(hào).$ 臨時(shí)號(hào).$ 更新號(hào).$ 補(bǔ)丁號(hào)峡眶,具體使用方法如下:
開發(fā)團(tuán)隊(duì)將在每6個(gè)月發(fā)布一個(gè)新功能版本,并將版本號(hào)的“$ 功能號(hào)”加1植锉。
2018年3月發(fā)布的版本為JDK 10辫樱,那么9月份的新版本就是JDK 11。開發(fā)團(tuán)隊(duì)在JEP 223中表示俊庇,他們希望每次新功能發(fā)布可以至少包含一到兩個(gè)重要功能狮暑。
“$ 臨時(shí)號(hào)”可以靈活使用,目前以6個(gè)月為期的發(fā)布方式中并沒有用到此項(xiàng)辉饱,所以到目前為止搬男,這個(gè)數(shù)字始終是0。
開發(fā)團(tuán)隊(duì)還將在功能發(fā)布之間穿插小的升級(jí)彭沼,這種升級(jí)不會(huì)包含不兼容的改動(dòng)缔逛。他們可以在功能發(fā)布后的1個(gè)月或3個(gè)月蛾茉,發(fā)布一次小的升級(jí)非洲,屆時(shí)可以將“$ 更新號(hào)”加1搀庶。
G1的并行Full GC
對(duì)于大多數(shù)開發(fā)者來(lái)說(shuō)屿脐,這只是個(gè)很小的變化。有的應(yīng)用程序甚至都不會(huì)注意到這個(gè)變化歉糜。
JDK 9中G1成了默認(rèn)的垃圾回收器。G1的設(shè)計(jì)目的旨在避免全面的垃圾回收望众,但是并不代表這種現(xiàn)象永遠(yuǎn)不會(huì)發(fā)生匪补。不幸的是,G1在執(zhí)行全面回收時(shí)僅使用了單線程的“標(biāo)記-清理-壓縮”算法烂翰,與之前的并行回收器相比這可能導(dǎo)致性能的下降夯缺。
JEP 307實(shí)現(xiàn)了這一算法的多線程版,從而解決了該問(wèn)題甘耿。從JDK 10開始踊兜,它將使用與Young GC和Mixed GC同樣多的線程數(shù)。
因此佳恬,如果應(yīng)用程序需要強(qiáng)制垃圾回收器執(zhí)行全面的回收捏境,那么JDK 10可以提高效率。
有關(guān)JDK 11的計(jì)劃
JDK 10還沒有正式發(fā)布毁葱,而距離JDK 11的發(fā)布只有7個(gè)月了垫言。所以,其開發(fā)團(tuán)隊(duì)已經(jīng)制定了幾個(gè)JEP的計(jì)劃倾剿,請(qǐng)參照2018年第二次新功能發(fā)布的信息:http://openjdk.java.net/projects/jdk/11/筷频。
除了刪除廢棄的Java EE和CORBA模型(JEP 320)、以及引入新的垃圾回收器(JEP 318)之外前痘,JDK 11還有可能引入動(dòng)態(tài)的類文件常量(JEP 309)凛捏,以及在隱含類型的匿名表達(dá)式中支持關(guān)鍵字var(JEP 323)。
JDK 11目前的范圍體現(xiàn)了縮短發(fā)布周期所帶來(lái)的優(yōu)勢(shì)芹缔,JEP 309和310引入了新功能坯癣,而其他兩個(gè)JEP則負(fù)責(zé)通過(guò)迭代方法改進(jìn)已有功能。
2017年9月JDK 9發(fā)布的時(shí)候最欠,Java EE和CORBA模塊就被廢棄了坡锡。一年以后,隨著JDK 11的發(fā)布窒所,JEP 320將把它們從JDK中刪除鹉勒。所以它們不會(huì)在Java中逗留太久,很快就要計(jì)劃刪除了吵取。
繼JEP 286在JDK 10中引入局部變量的類型推斷后禽额,JEP 323將進(jìn)一步提升這一功能。將來(lái)我們可以看到更多關(guān)于這方面的改進(jìn)。發(fā)布周期縮短后脯倒,團(tuán)隊(duì)可以分步在一次或多次功能發(fā)布中完成一個(gè)大功能实辑,從而降低發(fā)布的難度。
縮短支持周期需要快速適應(yīng)
Oracle在推出新的發(fā)布方式的同時(shí)藻丢,也改變了他們的支持方式剪撬。這個(gè)新的方式對(duì)短期發(fā)布和長(zhǎng)期發(fā)布的支持所有不同。
短期發(fā)布(如Java 9和10等)悠反,相關(guān)的面向公眾的支持會(huì)在下個(gè)版本發(fā)布時(shí)終止残黑。因此Java 9的支持將于2018年3月停止,而2018年9月后Java 10也無(wú)法再獲得支持斋否。
Java 11是一次長(zhǎng)期發(fā)布梨水。Oracle對(duì)這類發(fā)布的支持期限更長(zhǎng),但是到目前為止茵臭,他們還沒有宣布對(duì)Java 11的支持會(huì)持續(xù)到什么時(shí)候疫诽。
應(yīng)用程序開發(fā)者需要決定是否要每6個(gè)月更新一次Java版本,還是選擇多等幾年使用長(zhǎng)期的發(fā)布版本旦委。另外奇徒,Oracle鼓勵(lì)所有人使用Java SE的高級(jí)產(chǎn)品,它們的每個(gè)長(zhǎng)期發(fā)布版都包含至少5年的支持缨硝。
總結(jié)
過(guò)去逼龟,大量開發(fā)者抱怨Java的升級(jí)太慢,2018年后這種情況將有所改善追葡。全新的腺律、6個(gè)月為期的發(fā)布周期和相應(yīng)的支持模型,可以加速已有應(yīng)用程序的升級(jí)宜肉,并定期引入新功能匀钧。加上Java EE和Spring等已有框架的提升,Java界內(nèi)將出現(xiàn)全新的活力谬返。另一方面之斯,那些若干年才更新一次應(yīng)用程序的各大公司要做好心理準(zhǔn)備哦。
喜歡小編輕輕點(diǎn)個(gè)關(guān)注吧遣铝!