Java 20中有哪些新功能? - symflower

banq發表於2022-11-24

Java 20將於2023年3月釋出,預計將引入一系列變化和新功能。我們準備了一個先睹為快,看看哪些JEP最有可能被JDK 20接受,哪些JEP我們很有希望下一個被接受!
Java 20是計劃作為一個非LTS版本,而隨後的版本21將被設定為一個具有長期支援(LTS)的版本。

Java開發工具包(JDK)的開發基於JDK增強建議(JEP)的概念。實際上,這些增強建議是JDK釋出專案和所有相關開發活動的路線圖。
在編寫本報告時,JEP索引列出了437項改進建議,以及一些JEP草案和已提交的JEP。

JDK 20中需要哪些JEP?
1、記錄模式
作為JDK 19中的第一個預覽引入,並預期作為JDK 20中的第二個預覽。為了支援資料導航和處理,記錄模式簡化了與記錄元件的使用。在不更改型別模式的語法或語義的情況下,這將擴充套件更復雜資料查詢的模式匹配。

2、switch語句的模式匹配
作為JDK 17中的第一個預覽版引入,並預期作為JDK 20中的第四個預覽版。

switch (s) {
  case null ->
    { break; }
  case Triangle t
  when t.calculateArea() > 100 ->
    System.out.println("Large triangle");
  default ->
    System.out.println("A shape, possibly a small triangle");
}


3、外部函式&記憶體(FFM)API
FFM API的根源在於廣泛的JEP組合,這導致了它在JDK 19中的第一個預覽版,並有望在JDK 20中成為第二個預覽版。它允許呼叫Java程式的外部函式,以與外部程式碼和資料一起操作,例如在Java執行時之外,而沒有JNI的缺點和風險。FFM API的主要目標是擁有一個上級的純Java開發模型,並支援更廣泛的外部記憶體模型。

4、虛擬執行緒
作為JDK 19中的第一個預覽引入,並預期作為JDK 20中的第二個預覽。虛擬執行緒可提高編寫、維護和監視併發應用程式時的效率。它們是輕量級的,支援每個請求的執行緒可伸縮性,並且可以在對現有程式碼進行最小更改的情況下應用。傳統的Java執行緒精確地對映到一個作業系統執行緒,而虛擬執行緒並不繫結到特定的作業系統執行緒。因此,建立它們的成本很低,並且可以根據需要建立任意多個。

JDK20釋出後,哪些JEP令我們興奮
1、基元類primitive

JEP 401引入了對一種新的特殊型別的值類的支援,以定義基元型別。由於更好的儲存器訪問以及因為在CPU內更有效地執行基元操作,基元的使用使得能夠改進效能。透過此更新,開發人員可以獲得基元的效能優勢,同時保留類宣告的抽象和其他優勢。
為了能夠將基元的優點與典型的物件導向結合起來,基元類需要遵守以下兩條規則:

  • 原始類中的所有欄位都被隱式定義為final,即它們只能在建構函式或初始化函式中設定。
  • 此外,基元類不能具有隱式依賴於宣告類的欄位。

primitive class Point implements Shape {
   ...
}


2、值物件
傳統的Java物件提供標識,即它們的記憶體位置用於區分一個物件和另一個物件。提供標識在執行時代價很高,而且通常不會在實現中使用。透過這次提交,Java的物件模型擴充套件了值類和值物件。值類是無標識的,即它們可以提供基元型別的效能優勢,同時利用物件導向的概念。當在值物件上使用==時,它們的欄位值用於確定物件是否相等,而不是它們的記憶體位置。請注意,值類的所有欄位都是隱式final的,需要在初始化器或建構函式中設定!
實值類使用value,例如:

value class Point implements Shape {
  ...
}


3、Universal generics通用泛型
此提交透過還允許原始類作為型別引數,消除了型別引數必須是引用型別的要求。許多現有的泛型實現將開箱即用地使用這個新增功能,即它們可以用原始類作為其型別引數來例項化。但是,需要特別注意,以防程式碼對 null 進行賦值,因為原始類將因空指標異常而失敗。

4、字串模板
為了簡化常規字串組合,字串模板(又名字串文字)包含在執行時解釋的嵌入式表示式。透過向 Java 新增一種新的表示式(字串模板表示式),JEP 430使得使用包含在執行時計算的值的字串編寫程式碼變得更加簡單。這使得需要使用者輸入值的程式具有更好的可讀性、定義格式語法的靈活性以及更高的安全性。

多執行緒程式碼的補充
如果您正在使用多執行緒程式碼,請確保檢查這些新增項,它們提供了使多執行緒程式碼更易於閱讀或提供效能提升的選項。
1、Scoped values
使用 extent-local 變數,可以更容易地在 Java 中的執行緒內和子執行緒之間共享不可變資料。此更新的目標是簡化關於資料流的推理以提高可用性;提高健壯性,以便只有合法的被呼叫者才能檢索呼叫者共享的資料;並透過啟用執行時最佳化和將共享資料視為不可變來提高效能 雖然此更改不需要從執行緒區域性變數遷移,但它們更適合用於大量虛擬執行緒。

2、結構化併發
透過引入用於結構化併發的 API, JEP 428可以將在不同執行緒中執行的不同任務視為一個工作單元。這應該大大簡化多執行緒程式設計,並透過更容易確保程式碼的可靠性、可維護性和可觀察性來鼓勵開發人員應用併發程式設計。

更多令人興奮的 JEP

  • Sequenced collections:將 SequencedCollection 介面新增到標準庫,提供第一個定義集合中元素順序的集合。
  • Vector API:與標量計算相比,為了提高效能,這個新的 API 支援在執行時編譯向量計算。
  • 非同步堆疊跟蹤 API:引入了一個用於非同步收集堆疊跟蹤的新 API。
  • 類檔案 API:新增一個新的 API 來替換 ASM(或 cglib,或其他位元組碼庫),它將提供一種讀取、寫入和轉換 Java 類檔案的方法。



 

相關文章