Java 作為一門長(zhǎng)青的編程語(yǔ)言,在比較長(zhǎng)的發(fā)展時(shí)間里,時(shí)常會(huì)有唱衰的聲音。但 Java 一直在不斷向前發(fā)展,受歡迎程度也一直很高,TIOBE 榜單常年保持在 Top 2,未來(lái) Java 將如何發(fā)展呢?本文搜集了一些國(guó)外開(kāi)發(fā)者和相關(guān)從業(yè)人員的看法。
Java 語(yǔ)言發(fā)展的這 24 年也正是全世界互聯(lián)網(wǎng)技術(shù)飛速發(fā)展的 20 年,Java 語(yǔ)言同時(shí)也見(jiàn)證了電子商務(wù)浪潮、互聯(lián)網(wǎng)技術(shù)浪潮、互聯(lián)網(wǎng)大數(shù)據(jù)浪潮、云計(jì)算技術(shù)浪潮,所以在現(xiàn)今各大互聯(lián)網(wǎng)企業(yè)身上都能見(jiàn)到 Java 的身影。
縱看 Java 語(yǔ)言的發(fā)展趨勢(shì),禁不住讓人聯(lián)想到辛棄疾的一首詞:
千古江山,英雄無(wú)覓,孫仲謀處。舞榭歌臺(tái),風(fēng)流總被雨打風(fēng)吹去。斜陽(yáng)草樹(shù),尋常巷陌,人道寄奴曾住。想當(dāng)年,金戈鐵馬,氣吞萬(wàn)里如虎。元嘉草草,封狼居胥,贏得倉(cāng)皇北顧。四十三年,望中猶記,烽火揚(yáng)州路。可堪回首,佛貍祠下,一片神雅社鼓。憑誰(shuí)問(wèn),廉頗老矣,尚能飯否?
TIOBE 的語(yǔ)言排名榜顯示,自 2016 年初 Java 語(yǔ)言就出現(xiàn)了顯著的下頹趨勢(shì),開(kāi)發(fā)者社區(qū)也出現(xiàn)了一些唱衰 Java 語(yǔ)言的論調(diào),編者心中也有些許疑問(wèn):Java 老矣,尚能飯否?
java的往日輝煌
Java 語(yǔ)言始于 1991 年 Sun 企業(yè) James Gosling 領(lǐng)導(dǎo)的的 Ork 項(xiàng)目,1995 年 Sun 企業(yè)宣布起名為 Java,并提出“Write once, Run anywhere"的口號(hào)。
1996 年 1 月 Java 1.0 發(fā)布,提供了1個(gè)解釋執(zhí)行的 Java 虛擬機(jī),其時(shí)正逢互聯(lián)網(wǎng)技術(shù)剛開(kāi)始盛行,Java 的 Applet 能在 Mozilla 電腦瀏覽器中運(yùn)作,被看做是將來(lái)的互聯(lián)網(wǎng)技術(shù)語(yǔ)言。
1997 年 2 月 Java 1.1 發(fā)布,Java 語(yǔ)言的基礎(chǔ)特性基本明確了,例如反射 (reflection), JavaBean, 接口和類的關(guān)聯(lián)這些,始終到今日都完全一致。然而,Java 開(kāi)始的一些總體目標(biāo),如在電腦瀏覽器中執(zhí)行 Applet,以及跨平臺(tái)的圖形界面 Awt 很快遭受到負(fù)面影響的評(píng)論。
1998 年 12 月,Java 第一位里程碑式的版本,即 Java 1.2 發(fā)布了。這種版本應(yīng)用了 JIT(Just in time)編譯器技術(shù),促使語(yǔ)言的可遷移性和實(shí)行速率達(dá)到優(yōu)化的平衡,同時(shí) Collections 集合類設(shè)計(jì)良好,在企業(yè)應(yīng)用開(kāi)發(fā)中快速獲得了廣泛性應(yīng)用。Sun 公司把 Java 技術(shù)機(jī)制分為3個(gè)大方向,各自是 J2SE(面向桌面和通用應(yīng)用程序開(kāi)發(fā)),J2EE(面向企業(yè)級(jí)應(yīng)用開(kāi)發(fā)),J2ME(面向移動(dòng)終端開(kāi)發(fā))。這一歸類影響十分悠久,突顯出主流語(yǔ)言設(shè)計(jì)師的觀念:對(duì)于于不一樣的應(yīng)用領(lǐng)域,在特征,API 集合等開(kāi)展劃分。
2000 年 5 月,Java 1.3 公布,這種版本中 Corba 作為語(yǔ)言等級(jí)的分布式系統(tǒng)對(duì)象技術(shù)性,成為 J2EE 的一個(gè)技術(shù)條件。J2EE 受到 Corba 的設(shè)計(jì)的影響較大,早期 EJB 的 Home,接口類型和保持就是說(shuō) Corba 在 C 語(yǔ)言的實(shí)現(xiàn),被移植到 Java 語(yǔ)言當(dāng)中。J2EE 中的 Servlet 標(biāo)準(zhǔn)規(guī)范得到了巨大的成功,隨著著互聯(lián)網(wǎng)的興起,和瀏覽器真接通過(guò) HTTP 安全協(xié)議人機(jī)交互的 Servlet,和諸多的 MVC 架構(gòu),變成 Web1.0 的網(wǎng)紅。
2002 年 2 月,Java 1.4 發(fā)布,Java 語(yǔ)言真正邁向成熟期,保證了十分完善的語(yǔ)言特性,如 NIO,正則表達(dá)式,XML 處理器等。同年微軟的.NET 框架公布,兩者開(kāi)始了為期十多年的暗自竟?fàn)帯恼Z(yǔ)言特點(diǎn)上而言,.NET 后發(fā)先至,始終處在優(yōu)勢(shì)。但 Java 依賴優(yōu)良的開(kāi)發(fā)者生態(tài),絕大部分大型軟件公司的用戶眾多和不斷奉獻(xiàn),以及對(duì) Linux 電腦操作系統(tǒng)優(yōu)良的支持,逐漸的在服務(wù)器端取得優(yōu)越性主導(dǎo)地位。
2004 年 9 月,Java 5 發(fā)布,Sun 已不選用 J2SE, J2EE 這類取名方法,而使用 Java SE 5, Java EE 5 這樣的命名。我覺(jué)得 Java 5 是第二個(gè)里程碑式的版本。Java 語(yǔ)言語(yǔ)法產(chǎn)生太大的轉(zhuǎn)變,如注解 (Annotation),裝箱 (Autoboxing),泛型 (Generic),枚舉 (Enum),foreach 等被添加,提供了 java.util.concurrent 并發(fā)包。Java 5 對(duì)于 Java 語(yǔ)言的推進(jìn)是極大的,特別是注釋的加入,促使語(yǔ)言定義靈活了許多,程序員還可以寫出更為適用領(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)更新改造,應(yīng)用注解方法,歷經(jīng)應(yīng)用服務(wù)器對(duì) POJO 對(duì)象開(kāi)展提高來(lái)改變分布式服務(wù)能力。在某種意義,都可以說(shuō) EJB3 拯救了 JavaEE 的太早衰落。
2006 年 12 月,Java 6 發(fā)布,這個(gè)語(yǔ)言語(yǔ)法改善不多,但在虛擬機(jī)內(nèi)部結(jié)構(gòu)做了很多的改善,稱得上1個(gè)相當(dāng)成熟平穩(wěn)的版本,直到現(xiàn)在國(guó)內(nèi)的許多公司仍然以 Java6 當(dāng)做首要 Java 開(kāi)發(fā)版本來(lái)應(yīng)用。同年 Sun 公司作出1個(gè)值得尊敬的決策,將 Java 開(kāi)源。OpenJDK 從 Sun JDK 1.7 版本分支出去,成為今日 OpenJDK 的基礎(chǔ)。OpenJDK6 則由 OpenJDK7 剪裁而成,目前由紅帽承當(dāng)保護(hù),來(lái)滿足 Redhat Enterprise Linux 6.X 用戶的需要。
2009 年 12 月,JavaEE 6 公布,這個(gè)版本應(yīng)當(dāng)就是 JavaEE 到迄今為止改善多影響悠遠(yuǎn)的1個(gè)版本。由于 JavaEE5 只有 EJB3 適應(yīng)了 Java 注解語(yǔ)法的添加,而 EE6 全面接受了注釋。CDI 和 BeanValidation 規(guī)范的進(jìn)入,在 POJO 之中還可以界定完善的語(yǔ)義,由器皿來(lái)決策怎樣去做。Servlet 也升級(jí)到 3.0 版本,并在接口上添加異步支持,促使系統(tǒng)軟件總體速率可以大幅度提高。EE 劃分為 Full Profile 和 Web Profile,用戶還可以依據(jù)自身的需用挑選不一樣的功能集。
在此之前,Oracle 已經(jīng)以 74 億美金的價(jià)格收購(gòu)了 Sun 公司,獲得了 Java 商標(biāo)logo和 Java 主動(dòng)權(quán)。也收購(gòu)了 BEA 公司,得到市場(chǎng)占有率多的應(yīng)用服務(wù)器 Webogic。JavaEE 6 雖然是收購(gòu)之后發(fā)布的版本,但關(guān)鍵的設(shè)計(jì)方案工作依然由原 Sun 企業(yè)的 Java 權(quán)威專家進(jìn)行。
2011 年 7 月,Oracle 發(fā)布 Java 7, 列舉關(guān)鍵的特點(diǎn)是 NIO2 和 Fork/Join 并發(fā)包,雖然語(yǔ)言上沒(méi)有大的提高,但我本人覺(jué)得,自從 Oracle JDK(包括 OpenJDK7),Java 虛擬機(jī)的穩(wěn)定真正作到的工業(yè)級(jí),變成1個(gè)計(jì)算平臺(tái)而服務(wù)于全球。
2013 年 6 月,Oracle 公布 JavaEE 7,這一版本進(jìn)入了 websocket,Batch 的支持,而且加入 Concurrency 來(lái)對(duì)服務(wù)器多線程進(jìn)行監(jiān)管。然而全部的子標(biāo)準(zhǔn),算上選擇項(xiàng) (Optional) 總共有 40 多項(xiàng),開(kāi)發(fā)人員光是閱讀理解標(biāo)準(zhǔn)文本就很費(fèi)勁了,更不必說(shuō)可以全局速成熟練掌握。JavaEE 規(guī)范的本質(zhì)是企業(yè)級(jí)應(yīng)用設(shè)計(jì)的經(jīng)驗(yàn)結(jié)晶,每1個(gè) API 都?xì)v經(jīng)諸多豐富工作經(jīng)驗(yàn)的權(quán)威專家反反復(fù)復(fù)商討并明確。各個(gè)版本相互之間都可以保證向后兼容,換句話說(shuō),即便是 10 年前寫的 Servlet 程序,當(dāng)今的開(kāi)發(fā)者還可以流暢的閱讀源代碼,歷經(jīng)一部分代碼更改和配置改動(dòng),還可以部署在當(dāng)今的應(yīng)用服務(wù)器上。相反,今后用 Servlet4 寫的程序,瀏覽器和服務(wù)器通信應(yīng)用全新升級(jí)的 HTTP/2 協(xié)議,但程序員在理解上不會(huì)有障礙,就是說(shuō)因?yàn)?Servlet 規(guī)范的 API 十分平穩(wěn),基本找不到大的變動(dòng)修改。
2014 年 3 月,Oracle 發(fā)布 Java 8,這個(gè)版本是我認(rèn)為的第三個(gè)有里程碑式作用的 Java 版本。其中引人注意的便是 Lambda 表達(dá)式了,此后 Java 語(yǔ)言原生提供了函數(shù)式編程能力。語(yǔ)言層面大的特性提升還有:Streams,Date/Time API, 新的 Javascript 引擎 Nashorn,集合的并行計(jì)算支持等,Java8 更加適應(yīng)海量云計(jì)算的需要。
依照原先的計(jì)劃方案,Java9 應(yīng)該在2017年 7 月發(fā)布,但由于模塊化 (JPMS) 投票未通過(guò)的原因,推遲到2017年 9 月份發(fā)布。其中主要更新是 Servlet 4.0 和 CDI 2.0。
Ruby 強(qiáng)于 DSL(各個(gè)領(lǐng)域指定語(yǔ)言),程序員還可以界定豐富的語(yǔ)義來(lái)充足表述自身的思想。Erlang 就是為分布式計(jì)算設(shè)計(jì)的,能保證在規(guī)模性并發(fā)訪問(wèn)的狀況下,維持強(qiáng)壯和穩(wěn)定性。Go 語(yǔ)言內(nèi)置了并發(fā)能力,可以編譯成本地代碼。當(dāng)前新的網(wǎng)絡(luò)相關(guān)項(xiàng)目,很大比例是由 Go 語(yǔ)言編寫的,如 Docker、Kubernetes 等。
編寫網(wǎng)頁(yè)用 PHP,函數(shù)式編程有 Lisp,編寫 iOS 程序有 Swift/ObjectiveC。一段話歸納,能留到排行榜之中的語(yǔ)言,全部都是好的語(yǔ)言,在其所屬的領(lǐng)域能做到好。
那麼,Java 語(yǔ)言究竟有何優(yōu)勢(shì)可以占有排名榜第二的位子呢?
其一,語(yǔ)法非常簡(jiǎn)單,學(xué)過(guò)計(jì)算機(jī)編程的開(kāi)發(fā)者都能快速上手。
其二,在若干了領(lǐng)域都有較強(qiáng)的競(jìng)爭(zhēng)能力,例如服務(wù)端編程,高性能互聯(lián)網(wǎng)程序,企業(yè)軟件事務(wù)處理,分布式計(jì)算,Android 移動(dòng)終端應(yīng)用開(kāi)發(fā)這些。
重要的一點(diǎn)是符合工程學(xué)的需求,我們了解當(dāng)代軟件全是協(xié)作開(kāi)發(fā),那麼代碼可維護(hù)性,編譯時(shí)檢查,較為高效率的運(yùn)行效率,跨平臺(tái)能力,豐富的 IDE,測(cè)試,項(xiàng)目管理工具配合。都使得 Java 成為企業(yè)軟件公司的首選,也得到很多互聯(lián)網(wǎng)公司的青睞。
沒(méi)有薄弱點(diǎn),容易從市場(chǎng)上找到 Java 軟件工程師,軟件公司選擇 Java 做為首要編程語(yǔ)言,再在特定的領(lǐng)域應(yīng)用其他語(yǔ)言協(xié)作編程,這樣的組合選擇,肯定是不會(huì)有大的疑問(wèn)。
因此綜合性來(lái)講,Java 語(yǔ)言全能層面是好的。小編整理了一些java進(jìn)階學(xué)習(xí)資料和面試題,需要資料的請(qǐng)加JAVA高階學(xué)習(xí)Q群:664389243 這是小編創(chuàng)建的java高階學(xué)習(xí)交流群,加群一起交流學(xué)習(xí)深造。群里也有小編整理的2019年新全的java高階學(xué)習(xí)資料! ????
Java的未來(lái)展望
現(xiàn)如今的 Java,早已在功能性上相當(dāng)豐富多彩了,Java 8 加入 Lambda 特性,Java 9 加入模塊化特性之后,關(guān)鍵的語(yǔ)言特點(diǎn)好像早已都列入進(jìn)去。要是說(shuō)些該考量的一些作用,我認(rèn)為有以下幾點(diǎn):
模塊化改造結(jié)束以后,將會(huì)會(huì)冒出大量專業(yè)的 JDK 發(fā)行軟件商,提供在功能方面,例如針對(duì)于分布式計(jì)算,機(jī)器學(xué)習(xí),圖形計(jì)算等,納入相關(guān)的功能庫(kù)作為文件。這樣專業(yè)行業(yè)用戶還可以挑選歷經(jīng)充足提升后的 JDK 版本。
Java 語(yǔ)義上對(duì)“模式匹配”有更強(qiáng)的支持,如今的 switch 語(yǔ)句能力還是較為缺乏,可以向 Erlang, Scala 等語(yǔ)言效仿。
多線程并發(fā)處理,Java 做的已經(jīng)很好了。不過(guò)我本人感覺(jué)還可以在多進(jìn)程多線程配合,以及語(yǔ)言檔次數(shù)據(jù)管路表達(dá)上,可以開(kāi)展改建和提升。
JDK9 會(huì)有 HTTP/2 client 端的能力,但毫無(wú)疑問(wèn)會(huì)有更多更好的三方庫(kù)出現(xiàn),JDK 可以和這些三方庫(kù)通力合作,提供一個(gè)更好 API 界面和 SPI 參考實(shí)現(xiàn)。
目前 Java 在云計(jì)算方面遇到的大問(wèn)題還是占用內(nèi)存過(guò)大。我個(gè)人認(rèn)為從兩個(gè)方面來(lái)看:
如果該應(yīng)用的確是長(zhǎng)時(shí)間運(yùn)行的服務(wù),可以考慮結(jié)構(gòu)清晰的單體結(jié)構(gòu),算下來(lái)總的內(nèi)存消耗并不會(huì)比多個(gè)微服務(wù)進(jìn)程占用的更多。
微服務(wù)應(yīng)用,未來(lái)可以采用編譯成本地代碼的方式,并使用優(yōu)化過(guò)的三方庫(kù),甚至本地 so 文件,減少單個(gè)進(jìn)程的過(guò)多內(nèi)存占用。
安全框架更加清晰,SPI 可以允許三方庫(kù)提供更強(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)程訪問(wèn)特性和作為獨(dú)立執(zhí)行主體分布式對(duì)象能力。
加強(qiáng) JMS 和 MDB,媲美 Akka 目前的能力。
JaxRS 適度優(yōu)化,不必要依賴 Servlet,或者適度調(diào)整,來(lái)提供更大的能力。
JPA 借鑒 JDO,以及融入一部分特性,做到對(duì) NoSQL 更良好的支持。
Java 模塊化系統(tǒng)采用也是一個(gè)很有趣的話題。我敢肯定 OSGI 擁護(hù)者對(duì)于將它放在創(chuàng)新者階段會(huì)有意見(jiàn),但這樣做可能是對(duì)的。
我想可以將 Clojure 移到晚期大眾階段。當(dāng)然,人們還在用它,但我感覺(jué)到它的使用量在下降,而且它本身面向的就是利基市場(chǎng)。
我會(huì)將 Ceylon 移掉。它一直以來(lái)都沒(méi)有獲得太多關(guān)注,而且我不認(rèn)為進(jìn)入 Eclipse 會(huì)給它帶來(lái)多大幫助。這個(gè)項(xiàng)目的活躍度很低,過(guò)去 6 個(gè)月只有 10 個(gè)代碼提交。
測(cè)試框架的趨勢(shì)看起來(lái)相當(dāng)穩(wěn)定。我們要把它移掉嗎?從采用率來(lái)看,我給它們排個(gè)順序:JUnit、TestNG/Cucumber、Spock,但似乎變化不大?(相關(guān)推薦:java的變化有哪些)
SmartBear 近收購(gòu)了 Cucumber,可能會(huì)促進(jìn)它的發(fā)展,但即使是這樣,我仍然傾向于把它們移掉。
人們似乎對(duì) JVM 上的 Node 不感興趣?我想可以把它移掉。
我很想把 Kotlin 移到早期大眾階段,它是我近來(lái)經(jīng)常聽(tīng)到的一門 JVM 編程語(yǔ)言,這要得益于 Android 開(kāi)發(fā)的流行??梢哉f(shuō),它已經(jīng)越過(guò)了鴻溝,但仍然落后于其他編程語(yǔ)言,比如 Groovy、Swift 或 Go 語(yǔ)言。
我覺(jué)得 Scala 可以留在晚期大眾階段,人們會(huì)逐步棄用它。