Java老矣,尚能飯否?
發(fā)布時(shí)間:2021-08-03 09:42:43 已幫助:77人
Java 老矣,尚能飯否?
寫在前面
從1995年個(gè)版本發(fā)布到現(xiàn)在,Java語言已經(jīng)在跌宕起伏中走過了22年,最新的Java版本也已經(jīng)迭代到Java 9。當(dāng)年Java語言的跨平臺(tái)優(yōu)勢(shì)如今看來也只不過是家常小菜,Go、Rust等語言橫空出世,進(jìn)一步拓寬了編程語言的邊界。當(dāng)年發(fā)明Java語言的Sun公司早已被Oracle收購,Oracle現(xiàn)在也正處于水深火熱的云計(jì)算浪潮當(dāng)中,甚至連Java之父James Gosling也加入了當(dāng)今世界的云計(jì)算公司AWS。
Java語言發(fā)展的這20年也正是全球互聯(lián)網(wǎng)迅猛發(fā)展的20年,Java語言同時(shí)也見證了電商浪潮、移動(dòng)互聯(lián)網(wǎng)浪潮、大數(shù)據(jù)浪潮、云計(jì)算浪潮,所以在現(xiàn)今各大互聯(lián)網(wǎng)公司身上都能看到Java的身影。
縱看Java語言的發(fā)展,不禁讓人聯(lián)想到辛棄疾的一首詞:
千古江山,英雄無覓,孫仲謀處。舞榭歌臺(tái),風(fēng)流總被雨打風(fēng)吹去。斜陽草樹,尋常巷陌,人道寄奴曾住。想當(dāng)年,金戈鐵馬,氣吞萬里如虎。元嘉草草,封狼居胥,贏得倉皇北顧。四十三年,望中猶記,烽火揚(yáng)州路。可堪回首,佛貍祠下,一片神雅社鼓。憑誰問,廉頗老矣,尚能飯否?
Java語言的發(fā)展回顧
Java語言源于1991年Sun公司James Gosling領(lǐng)導(dǎo)的的Ork項(xiàng)目,1995年Sun公司正式起名為Java,并提出“Write once,Run anywhere"的口號(hào)。
1996年1月Java 1.0發(fā)布,提供了一個(gè)解釋執(zhí)行的Java虛擬機(jī),其時(shí)恰逢互聯(lián)網(wǎng)開始興起,Java的Applet能在Mozilla瀏覽器中運(yùn)行,被看作是未來的互聯(lián)網(wǎng)語言。
1997年2月Java 1.1發(fā)布,Java語言的基本形態(tài)基本確定了,比如反射(reflection),JavaBean,接口和類的關(guān)系等等,一直到今天都保持一致。然而,Java最初的一些目標(biāo),如在瀏覽器中執(zhí)行Applet,以及跨平臺(tái)的圖形界面Awt很快遭遇到負(fù)面的評(píng)價(jià)。
1998年12月,Java個(gè)里程碑式的版本,即Java 1.2發(fā)布了。這個(gè)版本使用了JIT(Just in time)編譯器技術(shù),使得語言的可遷移性和執(zhí)行效率達(dá)到最優(yōu)的平衡,同時(shí)Collections集合類設(shè)計(jì)優(yōu)良,在企業(yè)應(yīng)用開發(fā)中迅速得到了廣泛使用。Sun公司把Java技術(shù)體系分成三個(gè)方向,分別是J2SE(面向桌面和通用應(yīng)用開發(fā)),J2EE(面向企業(yè)級(jí)應(yīng)用開發(fā)),J2ME(面向移動(dòng)終端開發(fā))。這個(gè)分類影響非常久遠(yuǎn),體現(xiàn)出主流語言設(shè)計(jì)者的思想:針對(duì)于不同的應(yīng)用領(lǐng)域,在形態(tài),API集合等進(jìn)行劃分。
2000年5月,Java 1.3發(fā)布,這個(gè)版本中Corba作為語言級(jí)別的分布式對(duì)象技術(shù),成為J2EE的一個(gè)技術(shù)前提。J2EE受到Corba的設(shè)計(jì)的影響較大,早期EJB的Home,接口和實(shí)現(xiàn)就是Corba在C語言的實(shí)現(xiàn),被移植到Java語言之中。J2EE中的Servlet規(guī)范獲得了極大的成功,伴隨著互聯(lián)網(wǎng)的興起,和瀏覽器直接通過HTTP協(xié)議交互的Servlet,和眾多的MVC框架,成為Web1.0的網(wǎng)紅。
2002年2月,Java 1.4發(fā)布,Java語言真正走向成熟,提供了非常完備的語言特性,如NIO,正則表達(dá)式,XML處理器等。同年微軟的.NET框架發(fā)布,兩者開始了為期十幾年的暗自競爭。從語言特性上來說,.NET后發(fā)先至,一直處于優(yōu)勢(shì)。但Java依賴良好的開發(fā)者生態(tài),絕大多數(shù)大型軟件公司的使用者眾多和不斷貢獻(xiàn),以及對(duì)Linux操作系統(tǒng)良好的支持,漸漸的在服務(wù)器端獲得優(yōu)勢(shì)地位。
2004年9月,Java 5發(fā)布,Sun不再采用J2SE,J2EE這種命名方式,而使用Java SE 5,Java EE 5這樣的名稱。我認(rèn)為Java 5是第二個(gè)里程碑式的版本。Java語言語法發(fā)生很大的變化,如注解(Annotation),裝箱(Autoboxing),泛型(Generic),枚舉(Enum),foreach等被加入,提供了java.util.concurrent并發(fā)包。Java 5對(duì)于Java語言的推動(dòng)是巨大的,特別是注解的加入,使得語言定義靈活了很多,程序員可以寫出更加符合領(lǐng)域定義的描述性程序。
2006年5月,JavaEE 5發(fā)布,其中最主要是EJB3.0的版本升級(jí)。在此之前,EJB2.X版本被廣泛質(zhì)疑,SpringFramework創(chuàng)建者Rod Johnson在經(jīng)典書籍“J2EE Development without EJB“中,對(duì)EJB2代表的分布式對(duì)象的設(shè)計(jì)方法予以批駁。EJB3則重新經(jīng)過改造,使用注解方式,經(jīng)過應(yīng)用服務(wù)器對(duì)POJO對(duì)象進(jìn)行增強(qiáng)來實(shí)現(xiàn)分布式服務(wù)能力。在某種程度,可以說EJB3挽救了JavaEE的過早消亡。
2006年12月,Java 6發(fā)布,這個(gè)語言語法改進(jìn)不多,但在虛擬機(jī)內(nèi)部做了大量的改進(jìn),成為一個(gè)相當(dāng)成熟穩(wěn)定的版本,時(shí)至今日國內(nèi)的很多公司依然以Java6作為主要Java開發(fā)版本來使用。同年Sun公司做出一個(gè)偉大的決定,將Java開源。OpenJDK從Sun JDK 1.7版本分支出去,成為今天OpenJDK的基礎(chǔ)。OpenJDK6則由OpenJDK7裁剪而來,目前由紅帽負(fù)責(zé)維護(hù),來滿足Redhat Enterprise Linux 6.X用戶的需要。
2009年12月,JavaEE 6發(fā)布,這個(gè)版本應(yīng)該說是JavaEE到目前改進(jìn)影響最深遠(yuǎn)的一個(gè)版本。因?yàn)镴avaEE5只有EJB3適應(yīng)了Java注解語法的加入,而EE6全面接納了注解。CDI和BeanValidation規(guī)范的加入,在POJO之上可以定義完備的語義,由容器來決定如何去做。Servlet也升級(jí)到3.0版本,并在接口上加入異步支持,使得系統(tǒng)整體效率可以大幅提高。EE劃分為Full Profile和Web Profile,用戶可以根據(jù)自己的需要選擇不同的功能集。
在此之前,Oracle已經(jīng)以74億美金的價(jià)格收購了Sun公司,獲得了Java商標(biāo)和Java主導(dǎo)權(quán)。也收購了BEA公司,獲得市場份額的應(yīng)用服務(wù)器Webogic。JavaEE 6雖然是收購之后發(fā)布的版本,但主要的設(shè)計(jì)仍然由原Sun公司的Java專家完成。
2011年7月,Oracle發(fā)布Java 7,其中主要的特性是NIO2和Fork/Join并發(fā)包,盡管語言上沒有大的增強(qiáng),但我個(gè)人認(rèn)為,自從Oracle JDK(包括OpenJDK7),Java虛擬機(jī)的穩(wěn)定性真正做到的工業(yè)級(jí),成為一個(gè)計(jì)算平臺(tái)而服務(wù)于全世界。
2013年6月,Oracle發(fā)布JavaEE 7,這個(gè)版本加入了Websocket,Batch的支持,并且引入Concurrency來對(duì)服務(wù)器多線程進(jìn)行管控。然而所有的子規(guī)范,算上可選項(xiàng)(Optional)總共有40多項(xiàng),開發(fā)者光是閱讀規(guī)范文本就很吃力了,更不要說能夠全局精通掌握。JavaEE規(guī)范的本質(zhì)是企業(yè)級(jí)應(yīng)用設(shè)計(jì)的經(jīng)驗(yàn)?zāi)Y(jié),每一個(gè)API都經(jīng)過眾多豐富經(jīng)驗(yàn)的專家反復(fù)商議并確定。各個(gè)版本之間可以做到向后兼容,也就是說,即使是10年前寫的Servlet程序,當(dāng)前的開發(fā)者也可以流暢的閱讀源碼,經(jīng)過部分代碼調(diào)整和配置修改,可以部署在當(dāng)今的應(yīng)用服務(wù)器上。反過來,今后用Servlet4寫的程序,瀏覽器和服務(wù)器通信使用全新的HTTP/2協(xié)議,但程序員在理解上不會(huì)有障礙,就是因?yàn)镾ervlet規(guī)范的API非常穩(wěn)定,基本沒有大的變化修改。
2014年3月,Oracle發(fā)布Java 8,這個(gè)版本是我認(rèn)為的第三個(gè)有里程碑意義的Java版本。其中最引人注目的便是Lambda表達(dá)式了,從此Java語言原生提供了函數(shù)式編程能力。語言方面大的特性增加還有:Streams,Date/Time API,新的Javascript引擎Nashorn,集合的并行計(jì)算支持等,Java8更加適應(yīng)海量云計(jì)算的需要。
Java社區(qū)情況介紹
我們按照兩個(gè)方面介紹Java社區(qū)情況。
Java User Group(JUG,Java用戶組)目前全世界范圍有100多個(gè)JUG組織,分布在各個(gè)大洲各個(gè)國家,一般來說以地域命名。目前最有影響力的兩個(gè)JUG分別是倫敦的LJC(London Java Community)和巴西的SouJava,目前都是JCP的EC(執(zhí)行委員會(huì))成員。國內(nèi)目前有GreenTea JUG(北京和杭州),Shanghai JUG,GuangDong JUG,Shenzhen JUG,Nanjing JUG等。GreanTeaJUG以阿里巴巴研發(fā)部門成員為核心,包括北京和杭州兩地各個(gè)公司從事Java開發(fā)的研發(fā)人員,過去幾年成功舉辦了很多有業(yè)界影響力的活動(dòng),特別是邀請(qǐng)到眾多國外的Java技術(shù)專家來分享知識(shí),目前是國內(nèi)的JUG開發(fā)者組織。
Java開源社區(qū)Java是一門開放的語言,其開源社區(qū)也是參與者眾多。最有名的應(yīng)當(dāng)數(shù)Apache社區(qū),目前已經(jīng)擁有近200個(gè)項(xiàng)目,其中絕大多數(shù)是Java語言項(xiàng)目。在Java生態(tài)圈中,具有重要地位的如Ant、Commons、Tomcat、Xerces、Maven、Struts、Lucene、ActiveMQ、CXF、Camel、Hadoop等等。很多技術(shù)時(shí)代,一大批Java項(xiàng)目加入,如Web時(shí)代的Velocity、Wicket;JavaEE相關(guān)的Tomee、OpenJPA、OpenWebBeans、Myfaces;WebService時(shí)代的jUDDI、Axis、ServiceMix;Osgi時(shí)期的Flex、Karaf;大數(shù)據(jù)時(shí)代的HBase、Hive、ZooKeeper、Cassandra;云時(shí)代的Mesos、CloudStack等等。
涉及到軟件開發(fā)的方方面面,可以說當(dāng)今幾乎所有的中型以上Java應(yīng)用中,都會(huì)有Apache開源項(xiàng)目的身影。國內(nèi)最早參與Apache社區(qū)的以國外軟件公司國內(nèi)研發(fā)團(tuán)隊(duì)成員為主,如紅帽、IONA、Intel、IBM研發(fā)中心等。如今國內(nèi)互聯(lián)網(wǎng)公司和軟件公司也不斷的參與,特別是開始主導(dǎo)一些Apache項(xiàng)目,如Kylin等。
JBoss開源社區(qū),包含了50多個(gè)Java開源項(xiàng)目,其中有Hibernate、Drools、jBPM等業(yè)界知名開源項(xiàng)目,也有Undertow、Byteman、Narayana等名氣不算大,但絕對(duì)是相應(yīng)領(lǐng)域業(yè)界的優(yōu)秀項(xiàng)目。當(dāng)前JBoss開源社區(qū)主要以企業(yè)應(yīng)用中間件軟件為主,RedHat是主要的技術(shù)貢獻(xiàn)力量。
Eclipse開源社區(qū),之前主要是包含Eclipse IDE的項(xiàng)目,后來也逐步進(jìn)行多方面的擴(kuò)展,比如OSGi,服務(wù)器等,目前一些知名Java項(xiàng)目,如Jetty、Vertx等都是Eclipse開源組織成員。此外IOT目前是Eclispe的一個(gè)重點(diǎn)方向,在這里可以找到完整的IOT Java開發(fā)方案。
Spring開源社區(qū),以SpringFramework為核心,包括SpringBoot、SpringCloud、SpringSecurity、SpringXD等開源項(xiàng)目,在國內(nèi)有廣泛的應(yīng)用場景。
目前大的玩家
Java語言和品牌都是Oracle公司所有,所以O(shè)racle公司是Java最主要的廠商。絕大多數(shù)JSR(Java規(guī)范提案)的領(lǐng)導(dǎo)者都是Oracle的雇員。
Java是一個(gè)龐大的生態(tài)圈,全世界的軟件和互聯(lián)網(wǎng)公司絕大多數(shù)都是Java用戶,同時(shí)也可以參與推動(dòng)Java語言的發(fā)展。任何組織或者個(gè)人都可以加入JCP(Java Community Process),并提交JSR來給JavaSE,JavaEE,JavaME等提交新的API或者服務(wù)定義。Java擁有當(dāng)今最完備的語言生態(tài),幾乎所有能想到的應(yīng)用范圍,都有軟件廠商提出過標(biāo)準(zhǔn)化的構(gòu)想,其中很多已經(jīng)被接納為JSR提案。如今JSR總數(shù)已經(jīng)都400多個(gè)。
JCP是發(fā)展Java的國際組織,其中的執(zhí)行委員會(huì)(EC)以投票的形式對(duì)JSR提案進(jìn)行表決。目前EC包括16個(gè)合約(Ratified)席位,6個(gè)選舉(Elected)席位和2個(gè)合伙(Associate)席位,以及Oracle作為所有者的永久席位。非永久席位每兩年重新選舉一次,每次選舉為24個(gè)席位的一半,即為12個(gè)。
當(dāng)前EC委員會(huì)中,對(duì)于Java起到最重要作用的,無疑是Oracle,IBM和Redhat三家公司。Oracle自然不用說;Redhat領(lǐng)導(dǎo)著JavaEE8中兩項(xiàng)JSR,并且在操作系統(tǒng),Linux,虛擬化,云計(jì)算等基礎(chǔ)軟件方面是產(chǎn)品領(lǐng)導(dǎo)者;IBM是軟硬件的廠商,擁有自己的Unix操作系統(tǒng)和JDK版本。這三家軟件廠商也是中間件廠商的強(qiáng)者,它們對(duì)于Java的影響是至關(guān)重要的。前不久投票被否決的JSR 376(JPMS)模塊化提案,就是Redhat和IBM先后表示要投反對(duì)票,最后才沒有通過的。
另外的幾個(gè)重要的Java參與方分別包括:巨型互聯(lián)網(wǎng)公司,以Twitter為代表;大型金融公司,以高盛,瑞信為代表;強(qiáng)大的硬件產(chǎn)商,Intel,NXP,Gemalto等;大型系統(tǒng)方案廠商,HP,F(xiàn)ijitsu;當(dāng)然還有掌握先進(jìn)Java技術(shù)的公司,如Azul,Hazelcast,Tomitribe,Jetrains等等。這些公司共同對(duì)Java的發(fā)展起到關(guān)鍵作用。
GC方面的進(jìn)展
JDK中主要的GC分類有:
Serial,單線程進(jìn)行GC,在它進(jìn)行垃圾收集時(shí),必須暫停其他所有的線程,直到它收集結(jié)束。
Parallel,相比Serial收集器,Parallel最主要的優(yōu)勢(shì)在于使用多線程去完成垃圾清理,這樣可以充分利用多核的特性,大幅降低GC時(shí)間。
CMS(Concurrent Mark-Sweep),是以犧牲吞吐量為代價(jià)來獲得最短回收停頓時(shí)間的垃圾回收器。實(shí)現(xiàn)GC線程和應(yīng)用線程并發(fā),不需要暫停所有應(yīng)用線程。
G1(Garbage First Garbage Collector),G設(shè)計(jì)初衷是為了盡量縮短處理超大堆(大于4GB)時(shí)產(chǎn)生的停頓。相對(duì)于CMS的優(yōu)勢(shì)而言是內(nèi)存碎片的產(chǎn)生率大大降低。
目前在JDK8中以上4種GC都可以使用,而在JDK9中G1 GC會(huì)成為默認(rèn)的垃圾收集器。
在OpenJDK方面,Redhat開源并貢獻(xiàn)了Shenandoah GC。這是一種新的Java虛擬機(jī)GC算法,目標(biāo)是利用現(xiàn)代多核CPU的優(yōu)勢(shì),減少大堆內(nèi)存在GC處理時(shí)產(chǎn)生的停頓時(shí)間。在使用大內(nèi)存的應(yīng)用上使用,如>20G堆空間。Fedora24以后,官方源中的OpenJDK即帶有Shenandoah算法,不過JDK9中還不會(huì)被加入。
無停頓的高性能GC就是Azul公司的C4(Continuously Concurrent Compacting Collector)GC了,但只提供商業(yè)版本使用。
另外IBM J9中Balanced GC,表現(xiàn)也很出色,能夠相對(duì)一致的暫停時(shí)間而避免破壞性的長時(shí)間停頓。Balanced GC應(yīng)用在各類IBM中間件產(chǎn)品之中。
Java 9目前已經(jīng)可以確認(rèn)的特性介紹
Java9中,最受人關(guān)注的新特性就是Jigsaw項(xiàng)目帶來的模塊化技術(shù)特性。
Java語言一直缺乏語言級(jí)別的模塊化能力,目前模塊化技術(shù)通過OSGi,JBoss Modules等項(xiàng)目,已經(jīng)在服務(wù)端程序得到了廣泛的應(yīng)用。Java在語言級(jí)別引入模塊化能力,將極大的促進(jìn)Java應(yīng)用程序組件化,模塊化的改變。應(yīng)用程序通過模塊化拆分,可以做到更靈活的引入,加載,移除組件,占用更少的內(nèi)存,更適合云計(jì)算時(shí)代的要求。在JDK9 EA(預(yù)覽版)中,原有的rt.jar已經(jīng)被劃分為若干了jmod,通過模塊內(nèi)的module-info.java文件來聲明模塊間的引用關(guān)系。
然而,模塊化改造是個(gè)漸進(jìn)而適度的過程,Java9為了可兼容Java8以前應(yīng)用程序的運(yùn)行,做出很多的讓步,模塊定義嚴(yán)格性沒有那么苛刻。各個(gè)廠商也有對(duì)自己現(xiàn)有系統(tǒng)可無縫運(yùn)行在Java9上的商業(yè)訴求。Java模塊化提案還得花更多的時(shí)間去討論和修改。
Java9中的jshell工具實(shí)現(xiàn)了REPL,即讀取,求值,打印,循環(huán)。這個(gè)工具可以使得開發(fā)者交互式的使用Java,方便于系統(tǒng)管理,調(diào)試,使用。可以想像到有了jshell后,Java語言更加適合初學(xué)者入門學(xué)習(xí)。
Jlink工具和AOT(預(yù)先編譯技術(shù))。一直以來,Java運(yùn)行方式是把程序編譯成class文件,然后通過jvm運(yùn)行的。這種方式可以做到跨平臺(tái)移植,在互聯(lián)網(wǎng)時(shí)代初期,各種Unix繁榮和Windows在桌面的一統(tǒng)局面下,對(duì)于占據(jù)市場起到?jīng)Q定性作用。
然而到了今天,無論是大型互聯(lián)網(wǎng)公司還是企業(yè)內(nèi)部,x86平臺(tái)64位服務(wù)器已經(jīng)成為主要的選擇。從運(yùn)行效率考慮,可以把java程序編譯成可執(zhí)行的二進(jìn)制文件,更加適應(yīng)云計(jì)算和容器技術(shù)發(fā)展的需要。
利用jlink/jaotc工具,可以把一個(gè)Java程序編譯成可執(zhí)行文件,在Java9推出時(shí),可能只有java.base模塊支持AOT。
安全方面的加強(qiáng)。引入新的摘要算法SHA-3,內(nèi)置ALPN使得更好的支持HTTP/2協(xié)議,提供DTLS(數(shù)據(jù)包傳輸層安全性協(xié)議),可以UDP數(shù)據(jù)傳輸?shù)陌踩琍KCS12格式替代原有的JKS成為keystore的默認(rèn)格式。
此外,統(tǒng)一JVM日志(Unified JVM Logging),多版本共存jar(Multi-release jar files),接口內(nèi)部的私有方法(Interface provate method)等也是非常重要的新特性。
與其他語言的對(duì)比,Java的優(yōu)勢(shì)
Java是的語言么?不是,因?yàn)樵诿總€(gè)領(lǐng)域都有更合適的編程語言。
C語言無疑是現(xiàn)代計(jì)算機(jī)軟件編程語言的王者,幾乎所有的操作系統(tǒng)都是C語言寫成的。C++是面向?qū)ο蟮腃語言,一直在不斷的改進(jìn)。
JavaScript是能運(yùn)行在瀏覽器中的語言,豐富的前端界面離不開Javascript的功勞。近年來的Node.js又在后端占有一席之地。Python用于系統(tǒng)管理,并通過高性能預(yù)編譯的庫,提供API來進(jìn)行科學(xué)計(jì)算,文本處理等,是Linux必選的解釋性語言。
Ruby強(qiáng)于DSL(領(lǐng)域特定語言),程序員可以定義豐富的語義來充分表達(dá)自己的思想。Erlang就是為分布式計(jì)算設(shè)計(jì)的,能在大規(guī)模并發(fā)訪問的情況下,保持強(qiáng)壯和穩(wěn)定性。Go語言內(nèi)置了并發(fā)能力,可以編譯成本地代碼。當(dāng)前新的網(wǎng)絡(luò)相關(guān)項(xiàng)目,很大比例是由Go語言編寫的,如Docker、Kubernetes等。
編寫網(wǎng)頁用PHP,函數(shù)式編程有Lisp,編寫iOS程序有Swift/ObjectiveC。
一句話概括,能留在排行榜之上的語言,都是好的語言,在其所在的領(lǐng)域能做到。
那么,Java語言到底有什么優(yōu)勢(shì)可以占據(jù)排行榜的位置呢?
其一,語法比較簡單,學(xué)過計(jì)算機(jī)編程的開發(fā)者都能快速上手。
其二,在若干了領(lǐng)域都有很強(qiáng)的競爭力,比如服務(wù)端編程,高性能網(wǎng)絡(luò)程序,企業(yè)軟件事務(wù)處理,分布式計(jì)算,Android移動(dòng)終端應(yīng)用開發(fā)等等。
最重要的一點(diǎn)是符合工程學(xué)的需求,我們知道現(xiàn)代軟件都是協(xié)同開發(fā),那么代碼可維護(hù)性,編譯時(shí)檢查,較為高效的運(yùn)行效率,跨平臺(tái)能力,豐富的IDE,測試,項(xiàng)目管理工具配合。都使得Java成為企業(yè)軟件公司的首選,也得到很多互聯(lián)網(wǎng)公司的青睞。
沒有短板,容易從市場上找到Java軟件工程師,軟件公司選擇Java作為主要開發(fā)語言,再在特定的領(lǐng)域使用其他語言協(xié)作編程,這樣的組合選擇,肯定是不會(huì)有大的問題。
所以綜合而言,Java語言全能方面是的。
Java未來方向的展望
如今的Java,已經(jīng)在功能上相當(dāng)豐富了,Java 8加入Lambda特性,Java 9加入模塊化特性之后,重要的語言特性似乎已經(jīng)都納入進(jìn)來。如果要說值得考慮的一些功能,我覺得有以下幾點(diǎn):
模塊化改造完畢之后,可能會(huì)出現(xiàn)更多專業(yè)的JDK發(fā)行軟件商,提供在功能方面,比如針對(duì)于分布式計(jì)算,機(jī)器學(xué)習(xí),圖形計(jì)算等,納入相關(guān)的功能庫作為文件。這樣專業(yè)行業(yè)客戶可以選擇經(jīng)過充分優(yōu)化后的JDK版本。
Java語義上對(duì)“模式匹配”有更強(qiáng)的支持,如今的switch語句能力還是比較欠缺,可以向Erlang,Scala等語言借鑒。
多線程并發(fā)處理,Java做的已經(jīng)很好了。不過我個(gè)人覺得可以在多進(jìn)程多線程配合,以及語言級(jí)別數(shù)據(jù)管道表示上,可以進(jìn)行改造和優(yōu)化。
JDK9會(huì)有HTTP/2 client端的能力,但毫無疑問會(huì)有更多更好的三方庫出現(xiàn),JDK可以和這些三方庫通力合作,提供一個(gè)更好API界面和SPI參考實(shí)現(xiàn)。
目前Java在云計(jì)算方面遇到的問題還是占用內(nèi)存過大。我個(gè)人認(rèn)為從兩個(gè)方面來看:
如果該應(yīng)用的確是長時(shí)間運(yùn)行的服務(wù),可以考慮結(jié)構(gòu)清晰的單體結(jié)構(gòu),算下來總的內(nèi)存消耗并不會(huì)比多個(gè)微服務(wù)進(jìn)程占用的更多。
微服務(wù)應(yīng)用,未來可以采用編譯成本地代碼的方式,并使用優(yōu)化過的三方庫,甚至本地so文件,減少單個(gè)進(jìn)程的過多內(nèi)存占用。
安全框架更加清晰,SPI可以允許三方庫提供更強(qiáng)大更高效的安全功能。
JavaEE方向則有更多的改進(jìn)的地方:
EJB重構(gòu)目前的Corba分布通信基礎(chǔ),參考gRPC進(jìn)行遠(yuǎn)程系統(tǒng)調(diào)用。
分解EJB規(guī)范,把JVM進(jìn)程相關(guān)的特性,如注入/加強(qiáng)/事務(wù)/安全都統(tǒng)一到CDI規(guī)范中;對(duì)EJB進(jìn)行裁剪,保留遠(yuǎn)程訪問特性和作為獨(dú)立執(zhí)行主體分布式對(duì)象能力。
加強(qiáng)JMS和MDB,媲美Akka目前的能力。
JaxRS適度優(yōu)化,不必要依賴Servlet,或者適度調(diào)整,來提供更大的能力。
JPA借鑒JDO,以及融入一部分特性,做到對(duì)NoSQL更良好的支持。
一些個(gè)人的心得和經(jīng)驗(yàn)分享
軟件業(yè)有個(gè)Hype Cycle模型,有很多技術(shù)受到市場的追捧而成為明星,也有些身不逢時(shí)而備受冷漠。
EJB是一個(gè)廣泛被誤解的技術(shù),在企業(yè)應(yīng)用分布式計(jì)算方面,EJB給出了非常完備的技術(shù)體系。只是目前所有的應(yīng)用服務(wù)器都實(shí)現(xiàn)的不夠好。對(duì)于目前打算轉(zhuǎn)型微服務(wù)設(shè)計(jì)的架構(gòu)師,EJB也是一個(gè)非常值得學(xué)習(xí)借鑒的技術(shù)。
Java的慢是相對(duì)的,有些是當(dāng)前實(shí)現(xiàn)的不夠好。比如原來有人對(duì)Java的網(wǎng)絡(luò)IO性能提出質(zhì)疑,然而穩(wěn)定的Netty框架出現(xiàn)后,就沒有人再懷疑Java處理網(wǎng)絡(luò)IO的能力了,甚至在JDK8中自身的NIO也相當(dāng)出色。要知道Java為了實(shí)現(xiàn)跨平臺(tái)能力,采用的是各個(gè)操作系統(tǒng)的一個(gè)公共能力子集,而且其設(shè)計(jì)哲學(xué)就是給出API框架,實(shí)現(xiàn)是可以自行實(shí)現(xiàn)和加載服務(wù)的。
Java在處理界面方面,Swing和Swt表現(xiàn)可圈可點(diǎn)(Idea和Eclipse分別采用的圖形基礎(chǔ)庫),JavaFX已經(jīng)運(yùn)用到很多的行業(yè)軟件上。在瀏覽器界面表現(xiàn)上,SpringMVC在模板渲染頁面方面使用者最多;GWT似乎使用者不多,但基于GWT的Vaddin在國外企業(yè)中用戶眾多,而且很多服務(wù)器管理軟件也用GWT寫成;JSF也在企業(yè)軟件中得到廣泛使用,狀態(tài)信息直接在后端進(jìn)行管理,配合js前端框架,可以充分發(fā)揮各種技術(shù)的優(yōu)勢(shì)。
CDI規(guī)范和SpringFramework在服務(wù)器程序中作用類似,Spring是一套設(shè)計(jì)優(yōu)良,完備的框架,CDI具有更強(qiáng)的可擴(kuò)展性。通過對(duì)注解的語義定義,一家公司可以維護(hù)一套自己的組件描述語言,來做到產(chǎn)品和項(xiàng)目之間的軟件快速復(fù)用。CDI是定義軟件組件內(nèi)部模型的方式,只可惜了解的軟件工程師實(shí)在太少。
微服務(wù)架構(gòu)在互聯(lián)網(wǎng)應(yīng)用,快速開發(fā)運(yùn)維管理方面,配合容器技術(shù)使用,有很強(qiáng)的優(yōu)勢(shì)。但并不是所有的應(yīng)用場景都適合微服務(wù):強(qiáng)事務(wù)應(yīng)用系統(tǒng),采用單體結(jié)構(gòu)的軟件體系設(shè)計(jì),更容易從整體方面維護(hù),也能獲得更優(yōu)的性能。Java語言無論在微服務(wù)還是單體結(jié)構(gòu),都有成熟穩(wěn)定的軟件架構(gòu)供選擇使用。