Java 12 發佈了,沒有引發很大的討論。對於 Java 這樣一門成熟的語言來講,每一次更新彷佛都沒法知足龐大的 Java 開發羣體與生態圈。再加上 Oracle 對 Java 回味無窮的態度,Java 的將來會如何?
Java 的變化速度從未如此之快——現在,該語言的新版本每六個月就會發布一次。前端
而之因此可以實現如此重大的轉變,天然離不開一系列專一於提升其性能與添加新功能的協做性項目的貢獻。這些項目的目標可謂雄心勃勃。正如 JetBrains 開發者佈道師 Trisha Gee 在 QCon 倫敦 2019 大會上所言,「Java 即將迎來不少超酷的東西。」java
而發展道路中的如下三大主要項目,將有助於肯定 Java 的將來方向。程序員
嘗試改進 Java 語言的併發處理方式,或者說是在對計算機在不一樣指令集執行之間切換能力的探索。express
甲骨文公司 Loom 項目技術負責人 Ron Pressler 在 QCon 倫敦 2019 大會上向但願編寫軟件以處理併發任務的 Java 開發者們提出了兩種都不夠完美的選項:要麼編寫沒法經過擴展處理大量併發任務的「簡單同步阻塞代碼」,要麼編寫可擴展但編寫難度極高且調試過程複雜的異步代碼。編程
爲了尋求解決這個問題的方法,Loom 項目引入了一種將任務拆分爲線程的新方法——所謂線程,便是指計算機在運行指令時的最小可能執行單元。在這方面,Loom 引入了被稱爲 fibers 的新型輕量級用戶線程。後端
他在大會上指出,「利用 fibers,若是咱們確保其輕量化程度高於內核提供的線程,那麼問題就獲得瞭解決。你們將可以儘量多地使用這些用戶模式下的輕量級線程,且基本不會出現任何阻塞問題。」瀏覽器
利用這些新的 fibers,用戶將可以擴展 Java 虛擬機(JVM)以支持定界延續(delimited continuations)機制,從而使得指令集的執行實現暫停以及恢復。對這些延續進行暫停與恢復的任務將由 Java 中的 ForkJoinPool 調度程序以異步模式處理。安全
根聽說明文檔所言,fibers 將使用與 Java 現有 Thread 類很是類似的 API,這意味着 Java 開發人員的學習曲線應該不會太過陡峭。性能優化
Amber 項目的目標,在於支持「更小、面向生產力的 Java 語言功能」的開發,從而加快將新功能添加至 Java 語言中的速度。bash
這套方案很是適合自 Java 9 以來,以更快速度持續發佈的各 Java 新版本。
目前,如下 JDK 加強提案(簡稱 JEP)正在進行當中,並隸屬於 Amber 項目以內。
生字符串:
https://openjdk.java.net/jeps/326複製代碼
生字符串使得開發人員可以更輕鬆地對文本進行適當格式化,且無需引入由轉義字符帶來的複雜性。
舉例來講,開發人員沒必要使用
轉義字符來表示換行符,所以在如下字符串中:
Hello
World複製代碼
能夠直接編寫爲:
`Hello
World`複製代碼
而非本來的:
"Hello World"複製代碼
該提案的說明文檔中提到,這一變動將使得各種文本客串的輸入變得更加簡單,包括文件路徑以及 SQL 語句等等。
如你們所見,生字符串應被包含在反引號以內。
用於 JDK API 的 Java 編譯器 Intrinsic:
https://openjdk.java.net/jeps/348複製代碼
此項提案將容許開發人員對須要按期調用的重要代碼段進行性能優化。
具體來講,它容許開發人員將特定於 JDK 的方法指定爲編譯時內部化候選項,從而指示編譯器對其性能進行優化。
考慮到在 Java 當中的重要意義,此提案的說明文檔將 String::format 與 Objects::hash 做爲編譯時內部化方法示例。這些方法可使用 @IntrinsicCandidate 進行註釋,以指示編譯器將其視爲編譯時內部化候選項。如此一來,JDK 的 javac 編譯器便可經過修改建立出內部化進程的處理機制。
Pattern Matching:
https://openjdk.java.net/jeps/305複製代碼
Pattern Matching 可以簡化利用 Java 中 instanceof 運算符檢查對象是否屬於特定類的過程,然後提取該對象的組件以進行進一步處理。
如此一來,如下操做語法:
if (obj instanceof Integer) {
int intValue = ((Integer) obj).intValue();
// use intValue
}複製代碼
將可被簡化爲:
if (x instanceof Integer i) {
// can use i here, of type Integer
}複製代碼
Switch Expressions:
https://openjdk.java.net/jeps/325複製代碼
Switch expressions 已經在 Java 12 當中以預覽版形式推出,容許開發人員利用更簡單的語法經過 switch 語句爲輸入內容指定不一樣的響應方式。
舉例來講,如今咱們再也不須要始終在如下語法當中使用 switch 語句:
switch (port) {
case 20:
type = PortType.FTP;
break;
}複製代碼
而能夠採起如下更爲簡潔的表達方式:
Switch (port) {
case 20 -> PortType.FTP;
}複製代碼
Valhalla 項目專一於支持「高級」JVM 與語言功能的開發。
目前 Valhalla 項目的候選提案還比較有限,具體包括:
Value Types:
https://openjdk.java.net/jeps/169複製代碼
此項提案旨在容許 JVM 處理一種新的類型,即 Value Types。
這些新的不可變類型將擁有與 int 等基元相似的內存效率,但同時又與普通類同樣可以保存一整套基元集合。提案說明文檔中指出,其目標在於「爲 JVM 基礎設施提供處理不可變與無引用對象的能力,從而實現使用非基元類型進行高效按值計算的目標。」
Generic Specialization:
https://openjdk.java.net/jeps/218複製代碼
此項提案擴展了適用於泛型的具體類型,其中包括基元以及即將推出的 Value Types。
英文原文
Future of the Java programming language: Three major projects on the horizon
Java 8 是目前使用率最高的一個 Java 版本,發佈於 2014 年,而 Oracle 對 Java 8 的官方支持時間持續到 2020 年 12 月,以後將再也不爲我的桌面用戶提供 Oracle JDK 8 的修復更新;在 2019 年 1 月以後,再也不提供免費的商業版本更新,屆時想要繼續得到 Oracle 的商業支持和維護,需付費訂閱。
近日,Oracle 的銷售表明發出的一封郵件引發了熱議,該郵件稱「Java 8 的非公開可用的關鍵補丁更新」將於 2019 年 4 月 16 日發佈,擁有有效許可證的客戶才能夠享用。郵件繼續稱,若是沒有安裝這些更新,可能致使「你的服務器和桌面環境暴露且易受攻擊。」
但在許多 Java 用戶看來,這封郵件像是一種敲詐勒索或恐嚇策略。
雖然 Oracle 官方選擇了再也不支持,但 Java 社區卻把擔子接了下來。紅帽 Java 平臺團隊的首席工程師 Andrew Haley 曾表示,紅帽計劃在 2023 年以前繼續提供對 OpenJDK 8 的支持:
在我看來,這算比較正常的。幾年前,OpenJDK 6 更新(jdk6u)項目被 Oracle 放棄,我接管了它,而後 OpenJDK 7 也發生了一樣的事情。最後,Azul 的 Andrew Brygin 接管了 OpenJDK 6。由來自多個組織成員組成的 OpenJDK Vulnerability Group 就重要的安全問題進行協做。在廣大的 OpenJDK 社區和個人團隊(Red Hat)的幫助下,咱們按期爲關鍵 bug 和安全漏洞提供更新。我以爲這樣的過程一樣適用於 OpenJDK 8 和下一個長期支持版本,即 OpenJDK 11。
若是能夠獲得社區的支持,我很高興可以領導 JDK 8 更新項目和 JDK 11 更新項目。
除了紅帽之外,AWS 推出了 OpenJDK 長期支持版本 Amazon Corretto。阿里巴巴也開源了 OpenJDK 長期支持版本 Alibaba Dragonwell。
Java 是最好的語言麼?不是,由於在每一個領域都有更合適的編程語言。
C 語言無疑是現代計算機軟件編程語言的王者,幾乎全部的操做系統都是 C 語言寫成的。C++ 是面向對象的 C 語言,一直在不斷的改進。
JavaScript 是能運行在瀏覽器中的語言,豐富的前端界面離不開 Javascript 的功勞。近年來的 Node.js 又在後端佔有一席之地。Python 用於系統管理,並經過高性能預編譯的庫,提供 API 來進行科學計算,文本處理等,是 Linux 必選的解釋性語言。
Ruby 強於 DSL(領域特定語言),程序員能夠定義豐富的語義來充分表達本身的思想。Erlang 就是爲分佈式計算設計的,能保證在大規模併發訪問的狀況下,保持強壯和穩定性。Go 語言內置了併發能力,能夠編譯成本地代碼。當前新的網絡相關項目,很大比例是由 Go 語言編寫的,如 Docker、Kubernetes 等。
編寫網頁用 PHP,函數式編程有 Lisp,編寫 iOS 程序有 Swift/ObjectiveC。
一句話歸納,能留在排行榜之上的語言,都是好的語言,在其所在的領域能作到最好。
那麼,Java 語言到底有什麼優點能夠佔據排行榜第一的位置呢?
其一,語法比較簡單,學過計算機編程的開發者都能快速上手。
其二,在若干了領域都有很強的競爭力,好比服務端編程,高性能網絡程序,企業軟件事務處理,分佈式計算,Android 移動終端應用開發等等。
最重要的一點是符合工程學的需求,咱們知道現代軟件都是協同開發,那麼代碼可維護性,編譯時檢查,較爲高效的運行效率,跨平臺能力,豐富的 IDE,測試,項目管理工具配合。都使得 Java 成爲企業軟件公司的首選,也獲得不少互聯網公司的青睞。
沒有短板,容易從市場上找到 Java 軟件工程師,軟件公司選擇 Java 做爲主要開發語言,再在特定的領域使用其餘語言協做編程,這樣的組合選擇,確定是不會有大的問題。
因此綜合而言,Java 語言全能方面是最好的。
隨着 Java 每半年更新一次的腳步,Java 的新版本中也出現了愈來愈多與其餘語言類似的特性,博採衆長的 Java,還能繼續保持生機,你以爲呢?