Java 10 中的新增功能

Mondo 科技 更新 2024-01-30

區域性變數型別推理是乙個熱門的、有爭議的話題,但 J**A 10 為 JVM 中的垃圾回收和容器感知帶來了一些可喜的變化。

你認為你懂JAA程式設計嗎?事實是,大多數開發人員只觸及了 JAA 平台的表面,並且只學到了足夠的知識來完成工作。 在本系列中,J**a 技術偵探深入挖掘了 J**a 平台的核心功能,揭示了一些技巧和竅門,這些技巧和竅門將幫助您解決最棘手的編碼挑戰。

J**A 開發人員習等待新的 J**A 版本,但新的高頻版本的節奏改變了這一點。 J**A 9 問世僅 6 個月後,J**A 10 就問世了。 再等 6 個月,我們將得到 J**A 11。 一些開發人員可能認為這個發布節奏太快了,但這個新的節奏標誌著期待已久的變化。

就像它的版本號一樣,J**A 10 提供了 10 個新功能,本文將介紹我認為最重要的 5 個(您可以在 Open JDK 的 10 個專案頁面上看到所有新功能)。 從歷史上看,JDK 的發布節奏是由重要的新功能驅動的。 在最近的案例中,J**A 8 以 lambda 表示式和流的形式引入了函式式程式設計,J**A 9 引入了模組化的 J**A 系統。 每個新版本都熱切期待,而小的修復通常會被擱置一旁,等待更大元件的最終確定。 j**a 的發展落後於其他語言。

新的高頻節奏會促使 J**A 在有小的改進時發布新版本。 在發布日期之前,新版本中包含現成的功能,未準備好的功能可以計畫在 6 個月後的下乙個版本中包含在中。 這個新週期中的第乙個 j**a 版本是 j**a 9,它於 2017 年 10 月推出。 J**A 10 於 2018 年 3 月發布,J**A 11 預計將於 2018 年 9 月發布。

作為新節奏的一部分,甲骨文表示,它對每個主要版本的支援將只持續到下乙個主要版本可用。 當 J**A 11 發布時,Oracle 將停止支援 J**A 10。 如果開發人員想要確保其 j**a 版本受支援,則需要每 6 個月遷移到乙個主要版本。 不想或不需要經常遷移的開發人員可以使用 LTS(長期支援)版本,該版本每 3 年更新一次。 對當前 LTS 版本 (J**A 8) 的支援將於今年秋季 J**A 11 推出時結束。

區域性變數型別推斷是 J**a 10 中迄今為止最值得注意的功能。 這個特性是在 JDK 10 中引入的,它允許編譯器推斷區域性變數的型別,而不是要求程式設計師顯式指定變數型別。

清單 1 顯示了在 j**a 10 之前如何定義它string變數型別。

清單 1宣告並分配字串變數。

string name = "alex";
show moreshow more icon

清單 2 給出了與 j**a 10 中定義的相同的結果string變數。

清單 2使用區域性變數型別推斷功能定義的字串變數。

var name = "alex";
show moreshow more icon

如您所見,唯一的區別是使用了預留型別名稱var。使用右側的表示式,編譯器可以推斷變數name型別為:string

這可能看起來很簡單,所以讓我們看乙個更複雜的例子。 如果將變數分配給方法呼叫的返回值,會發生什麼情況?在這種情況下,編譯器可以從方法的返回型別推斷變數型別,如清單 3 所示。

清單 3從返回型別推斷的字串變數。

var name = getname();string getname()
show moreshow more icon

顧名思義,區域性變數型別推斷功能只能用於區域性變數。 不能使用它來定義例項或類變數,也不能在方法引數或返回型別中使用它。 但是,在可以從迭代器推斷型別的經典和增強的 for 迴圈中,您可以使用var如清單 4 所示。

清單 4在迴圈中使用 var

for(var book : books){}for(var i = 0; i < 10; i++)
show moreshow more icon

使用此型別的最明顯原因是減少 **. 請看清單 5 中的示例。

清單 5長型別名稱使 ** 更長。

string message = "incy wincy spider..."; stringreader reader = new stringreader(message); streamtokenizer tokenizer = new streamtokenizer(reader);
show moreshow more icon

請注意,我們使用保留的型別名稱var重寫清單 5 後發生了什麼。

清單 6var 型別可減少冗餘。

var message = "incy wincy spider..."; var reader = new stringreader(message); var tokenizer = new streamtokenizer(reader);
show moreshow more icon

清單 6 中的型別宣告是垂直排列的,並且每個語句中只提到一次型別,位於構造函式呼叫的右側。 想象一下,將此型別用於 j**a 框架中常見的長類名的一些好處。

1.var 模糊了型別,你已經知道了var可讀性可以提高,但另一方面,它也有可能使型別模糊不清。 請看清單 7 中的示例。

清單 7返回型別不明確。

var result = searchservice.retrievetopresult();
show moreshow more icon

在清單 7 中,我們必須猜測返回型別。 要保持讓讀者猜測發生了什麼的**就更難了。

2.var 不能與 lambda 一起使用,並且在 lambda 表示式中使用型別推斷時效果不佳,主要是由於編譯器缺少可用的型別資訊。 清單 8 中的 lambda 表示式無法編譯。

清單 8型別資訊不足。

function quotify = m ->"'" + message + "'"; var quotify = m ->"'" + message + "'";
show moreshow more icon

在清單 8 中,右側表示式中沒有足夠的型別資訊供編譯器推斷變數型別。 Lambda 語句必須始終聲明顯式型別。

3.var 不能與菱形運算子一起使用,並且型別推斷在與菱形運算子一起使用時效果不佳。 請看清單 9 中的示例。

清單 9將菱形運算子與 var 一起使用

var books = new arraylist<>(
show moreshow more icon

親自試一試

要自行嘗試區域性變數型別推斷,您需要 JDK 10 和支援它的 IDE。 IntelliJ 的 EAP(搶先體驗計畫)版本提供了這種支援。 安裝這些工具後,您可以首先檢視本文附帶的 github 儲存庫。 您可以在此處找到區域性變數型別推斷的示例。 在清單 9 中,books引用arraylist引數型別是什麼?您可能知道,您希望arraylist儲存了書籍列表,但編譯器無法推斷這一點。 相反,編譯器只會做它能做的事,即推斷乙個原因object型別引數化arraylistarraylist()

相反,請在右側表示式的菱形運算子中指定型別。 然後,您可以讓編譯器根據該資訊推斷變數型別,如清單 10 所示。 否則,您必須以傳統方式顯式宣告變數:list books。事實上,您可能更喜歡此選項,因為它允許您指定抽象型別和程式list介面:

清單 10指定型別。

var books = new arraylist();
show moreshow more icon

J**A 10 刪除了一些工具:

命令列工具j**ah,但你可以使用它j**ac -h更換它。 命令列選項-x:prof,但你可以使用它jmap用於訪問分析資訊的工具。 policytool。有些是由於 j**a 12 標記為已棄用的 API,已被永久刪除。 這些 API 包括:j**a.lang.securitymanager.incheck欄位和以下方法:

j**a.lang.securitymanager.classdepth(j**a.lang.string)j**a.lang.securitymanager.classloaderdepth()j**a.lang.securitymanager.currentclassloader()j**a.lang.securitymanager.currentloadedclass()j**a.lang.securitymanager.getincheck()j**a.lang.securitymanager.inclass(j**a.lang.string)j**a.lang.securitymanager.inclassloader()j**a.lang.runtime.getlocalizedinputstream(j**a.io.inputstream)j**a.lang.runtime.getlocalizedoutputstream(j**a.io.outputstream)JDK 10 還棄用了一些 API。 j**a.security.acl該包被標記為已棄用j**a.security包中的各種相關類 (certificateidentityidentityscopesingerauth.policy事實也是如此。 另外j**ax.management.remote.rmi.rmiconnectorservercredential_types也標記為已棄用。 j**a.io.fileinputstreamj**a.io.fileoutputstreamfinalize()方法已標記為已棄用。 j**a.util.zip.deflaterinflaterzipfilefinalize()方法也是如此。

作為 Oracle JDK 與 Open JDK 持續協作的一部分,Open JDK 現在包括 Oracle JDK 中可用的根證書頒發機構的子集。 這些機構包括 J**a 飛行記錄器和 J**A 任務控制中心。 此外,在j**a.textj**a.timej**a.util在適當的情況下,JDK 10 還增強了對 BCP 的 47 種語言標記的 Unicode 擴充套件的支援。 另乙個新功能允許在不執行全域性 VM 安全點的情況下進行程序執行。 這使得終止單個執行緒變得可行且經濟,而無需終止所有執行緒或根本不終止任何執行緒。

如果要部署到 docker 等容器中,此功能特別適合您。 JVM 現在知道它正在容器中執行,並查詢該容器中可供使用的處理器數量,而不是主機作業系統。 還可以從外部連線到容器中執行的 JVM 程序,這樣可以更輕鬆地監視 JVM 程序。

以前,JVM 對其容器一無所知,並且會向主機作業系統詢問活動 CPU 的數量。 在某些情況下,這可能會導致向 JVM 報告過多的資源,從而在多個容器在同一作業系統上執行時導致問題。 在 J**A 10 中,您可以將容器配置為使用主機作業系統的一部分 CPU,並且 JVM 能夠確定正在使用的 CPU 量。 它也可以使用-xx:activeprocessorcount標誌,它顯式指定容器化 JVM 可以看到的處理器數。

此功能的目的是縮短執行之間的 JVM 引導時間,允許多個 JVM 執行相同的 **,同時減少記憶體占用。 這是通過在 JVM 之間共享有關類的元資料來實現的。 JVM 的第一次執行會收集並記錄有關它所載入的類的資料。 然後,它使資料檔案可供其他 JVM 和該 JVM 的後續執行使用,從而節省 JVM 初始化過程中的時間和資源。 類資料共享實際上已經存在了一段時間,但僅適用於系統類。 此功能現已擴充套件為包括所有應用程式類。

J**A 10 中最熱門的功能顯然是新的保留型別名稱var。它澄清和簡化了**,但如果使用不慎,它可能會模糊含義和意圖。 當型別不明確時,IDE 可以幫助識別型別,但它不會將所有 ** 讀入 IDE。 我們通常在 GitHub 儲存庫、偵錯程式或審查工具中閱讀。 對於使用此新功能的開發人員,建議考慮未來讀者和維護人員的可讀性。

J**a 新的高頻發布節奏是乙個可喜的變化。 它要求在發布日期之前發布準備好的功能,從而允許在下乙個版本之前發布延遲功能的周轉時間很短。 新的週期加速了 J**a 的進度,開發人員不必等待數年才能獲得已經開發和擱置的功能。 有理由擔心支援從乙個主要版本到下乙個主要版本的更短週期,但 LTS 應該有助於緩解這個問題。 另乙個風險是版本疲勞,因為開發人員厭倦了不斷遷移。 也就是說,總的來說,我認為這是乙個積極的舉動,將幫助 J**a 在未來一段時間內保持活力和成長。

相關問題答案

    Java 10 中的新增功能

    快速了解 J A 中的更改。J a 是當今使用最廣泛的程式語言之一,於 年 月 日發布了第十個主要版本。為了更快迭代,更好地跟進社群反饋,j a 語言版本的發布週期已調整為每 個月發布一次。J A 是此新規則之後新發布週期的第乙個主要版本。J a 帶來了許多新功能,其中一項在區域性變數型別的推理中最...

    什麼是專業化、精細化和創新?什麼是專項、專項和新補貼?在一篇文章中理解它

    近年來,中國高度重視中小企業的發展。工業和資訊化部發布 優質中小企業梯度培育管理暫行辦法 對 專精特新中小企業認定標準 和 專精特新 小巨人 認定標準 進行了詳細說明。一 專業化 精細化 創新的意義 指在特定方面具有獨特專業知識和經驗,以及對新興事物和趨勢有敏銳感知和洞察力的領域或技能。這句話強調個...

    專注新賽道、專精特新、新型“小巨人”企業!

    今天我們就來聊聊製造業 資訊科技 機械人等領域正在興起的小巨人企業!原則上,這些企業的主導產品都屬於重點領域,這讓人感嘆 科技的力量是無窮無盡的!一 專精特新 小巨人 企業指的是什麼型別的企業?專精特新小巨人是指在成長期業績 發展潛力和培育價值較好,通過培育促進其健康成長,最終成為行業或區域內的 巨...

    22020F 10 風冷充電模組特點和優勢:

    F 風冷充電模組是一種高效可靠的充電解決方案,廣泛應用於電池充電 動力系統和電動汽車。其獨特的設計和卓越的效能使其在市場上脫穎而出。本文將詳細介紹F 風冷充電模組的特點和優勢。.特點。高效充電 F 風冷充電模組採用先進的充電技術,提供高效的充電效率,可大大減少充電時間,提高充電速度。風冷設計 模組採...

    山葉 2024 MT 10 全新深灰色配色!

    山葉推出了 MT 和 MT SP 街頭自行車,為 MT 採用新的深灰色配色,配備充滿活力的藍綠色車輪。SP版沒有公布新的汽車顏色。預計將於 年 月 日開始銷售,將在日本的 YSP 和 Advance 經銷商處發售。自年開始銷售的MT ABS是MT系列中排量最大的車型,排量從cc到大排量不等。它採用與...