2020年9月15日,Oracle官方發佈了JDK15版本,及時關注官方的更新動態,可讓咱們在平常開發中更合理的選擇更加優秀的工具方法,避免使用一些過期的或一些即將被刪除類和方法,保障程序的健壯性、穩定性、可移植性。html
JEP:JDK Enhancement Proposals ,JDK 特性的新增和修改建議。java
官方描述:程序員
EdDSA是一種現代的橢圓曲線簽名方案,與JDK中的現有簽名方案相比,具備多個優勢。算法
簡而言之:sql
Edwards-Curve 數字簽名算法(EdDSA)實現加密簽名功能。且比現有的JDK 中的簽名安全性和性能更高。shell
官方描述:編程
經過密封的類和接口加強Java編程語言。密封的類和接口限制能夠擴展或實現它們的其餘類或接口。經過將sealed修飾符應用於其聲明來密封類。而後,在anyextends和implements子句以後,該permits子句指定容許擴展密封類的類。api
簡而言之:
安全
限定接口的實現或子類,不是全部的類都能繼承此類或實現此類。併發
注意:
代碼實現:
1 // 建立Person 密封類 2 public abstract sealed class Person permits Student, Teacher, Doctor{ 3 4 } 5 6 // 學生類繼承人類 7 non-sealed class Student extends Person{ } 8 9 // 老師類繼承人類 10 final class Teacher extends Person{ } 11 12 // 醫生類繼承人類 13 sealed class Doctor extends Person permits OutpDoctor, InpatDoctor{ } 14 15 // 門診醫生繼承人類 16 final class OutpDoctor extends Doctor{ } 17 18 // 住院醫生繼承人類 19 non-sealed class InpatDoctor extends Doctor{ }
1 // 方法類型描述 2 public sealed interface MethodTypeDesc permits DynamicConstantDesc, MethodTypeDescImpl {} 3 4 // 方法類型描述實現 5 final class MethodTypeDescImpl implements MethodTypeDesc { } 6 7 // 動態約束描述 8 non-sealed class DynamicConstantDesc implements MethodTypeDesc {}
官方描述:
隱藏類是其餘類的字節碼不能直接使用的類。隱藏類適用於在運行時生成類並經過反射間接使用它們的框架。隱藏類能夠定義爲訪問控制嵌套的成員,而且能夠獨立於其餘類進行卸載。
簡而言之:
隱藏類的超類型是由類加載器建立的,但隱藏類自己的建立並不涉及任何類加載器。因此能夠方便的進行卸載且不用考慮安全問題,而且能夠減小程序的內存佔用。
官方描述:
隨着ECMAScript語言構造以及API的快速適應和修改,咱們發現Nashorn難以維護。官方決定刪除Nashorn JavaScript腳本引擎和API,以及該jjs
工具。
兩個JDK模塊將被永久刪除:
官方描述:
用更易於維護和調試的更簡單,更現代的實現來替換java.net.DatagramSocket
和java.net.MulticastSocket
API的基礎實現。新的實現將很容易適應虛擬線程的工做,當前正在Project Loom中進行探索。
改動緣由:
java.net.DatagramSocket
和java.net.MulticastSocket
API的代碼庫及其基礎實現很舊且脆弱:
實現能夠追溯到JDK 1.0。它們是傳統Java和C代碼的混合,難以維護和調試。
的實現MulticastSocket
尤爲成問題,由於它能夠追溯到IPv6仍處於開發階段。許多基本的本機實現都嘗試以難以維護的方式協調IPv4和IPv6。
該實現還存在一些併發問題(例如,異步關閉),須要進行大修才能正確解決。
此外,在駐留而不是阻塞系統調用中底層內核線程的虛擬線程的狀況下,當前實現不適合此目的。隨着基於數據報的傳輸再次得到牽引力(例如 QUIC),須要更簡單,更可維護的實現。
官方描述:
在JDK 15以前,始終啓用並提供偏置鎖定。使用此JEP,除非 -XX:+UseBiasedLocking
在命令行上設置,不然在啓動HotSpot時將再也不啓用偏置鎖定。
改動緣由:
肯定是否須要繼續支持偏向鎖定的傳統同步優化,這是維護成本很高的方法。有偏見的鎖定會帶來爭用時須要進行昂貴的撤銷操做的代價。
官方描述:
經過爲操做員提供模式匹配來加強Java編程語言instanceof。模式匹配使程序中的通用邏輯(即從對象中有條件地提取組件)得以更簡潔,更安全地表示。
簡而言之:
可使咱們的代碼更加簡潔。
代碼示例:
1 public static void main(String[] args) { 2 Object str = "模式匹配"; 3 // 模式匹配 4 // 綁定變量s的做用域在&&運算符的右側以及true塊中、綁定變量s不在||右側的範圍內 5 // if(str instanceof String s && s.length() > 0 ){ 6 if(str instanceof String s){ 7 System.out.println(s); 8 }else { 9 // s不能做用於此處 10 // System.out.printf(s); 11 } 12 }
官方描述:
對ZGC的測試代表它是穩定的,而且在撰寫本文時,咱們已經有幾個月沒有收到針對ZGC的新錯誤了。藉助ZGC現在擁有的穩定性,功能集和平臺支持,是時候刪除其實驗狀態並使其成爲產品功能了。
今天,能夠經過-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
命令行選項啓用ZGC 。使ZGC成爲產品(非實驗性)功能意味着-XX:+UnlockExperimentalVMOptions
再也不須要該選件。
該JEP不建議更改默認GC,該默認GC仍爲G1。
簡而言之:
ZGC垃圾收集器在JDK15成爲正式版,咱們能夠經過-XX:+UseZGC
命令行選項啓用ZGC,可是須要注意的是默認的垃圾收集器仍然是G1。
官方描述:
將文本塊添加到Java語言。文本塊是多行字符串文字,它避免了大多數轉義序列的須要,以一種可預測的方式自動設置字符串的格式,並在須要時使開發人員能夠控制格式。
解決了在Java中,在字符串文字中嵌入HTML,XML,SQL或JSON片斷"..."
一般須要先進行轉義和串聯的大量編輯,而後才能編譯包含該片斷的代碼。該代碼段一般難以閱讀且難以維護的問題。
代碼示例:
1 public static void main(String[] args) { 2 String html = "<html>\n" + 3 " <body>\n" + 4 " <p>Hello, world</p>\n" + 5 " </body>\n" + 6 "</html>\n"; 7 8 String htmlText = """ 9 <html> 10 <body> 11 <p>Hello, world</p> 12 </body> 13 </html> 14 """; 15 16 System.out.println("html長度" + html.length()); 17 System.out.println("htmlText長度" + htmlText.length()); 18 19 String query = "SELECT \"EMP_ID\", \"LAST_NAME\" FROM \"EMPLOYEE_TB\"\n" + 20 "WHERE \"CITY\" = 'INDIANAPOLIS'\n" + 21 "ORDER BY \"EMP_ID\", \"LAST_NAME\";\n"; 22 23 String queryText = """ 24 SELECT "EMP_ID", "LAST_NAME" FROM "EMPLOYEE_TB" 25 WHERE "CITY" = 'INDIANAPOLIS' 26 ORDER BY "EMP_ID", "LAST_NAME"; 27 """; 28 29 System.out.println("query長度" + query.length()); 30 System.out.println("queryText長度" + queryText.length()); 31 32 // \:取消換行操做 33 // \s:標識一個空格 34 String sql1 = """ 35 SELECT id, name, age \ 36 FROM person\s\ 37 WHERE id > 4 \ 38 ORDER BY age DESC 39 """; 40 41 String sql2 = "SELECT id, name, age FROM person WHERE id > 4 ORDER BY age DESC"; 42 43 }
錯誤代碼示例:
1 String a = """"""; // no line terminator after opening delimiter 2 3 String b = """ """; // no line terminator after opening delimiter 4 5 String c = """ 6 "; // no closing delimiter (text block continues to EOF) 7 8 String d = """ 9 abc \ def 10 """; // unescaped backslash (see below for escape processing)
注意:
文本塊: """ line 1 line 2 line 3 """ 等效於字符串文字: "line 1\nline 2\nline 3\n" 或字符串文字的串聯: "line 1\n" + "line 2\n" + "line 3\n" --------------------------------------------------------- """ line 1 line 2 line 3""" 等效於字符串文字: "line 1\nline 2\nline 3"
官方描述:
將Shenandoah垃圾收集器從實驗功能更改成產品功能。
在JDK 12和更高版本中,經過-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC
選項啓用了Shenandoah 。將Shenandoah成爲產品功能意味着-XX:+UnlockExperimentalVMOptions
再也不須要。
簡而言之:
Shenandoah垃圾收集器功能轉正,能夠經過-XX:+UseShenandoahGC直接使用,Shenandoah 的暫停時間與堆大小無關。
官方描述:
刪除全部特定於Solaris操做系統的源代碼。
刪除全部特定於SPARC體系結構的源代碼。
更新文檔和源代碼註釋以用於未來的版本。
改動緣由:
當前正在開發的許多項目和功能(例如Valhalla,Loom和Panama)都須要對CPU體系結構和特定於操做系統的代碼進行重大更改。放棄對Solaris和SPARC端口的支持將使OpenJDK社區中的貢獻者可以加速新功能的開發,這些新功能將推進平臺向前發展。
官方描述:
引入一個API,以容許Java程序安全有效地訪問Java堆以外的外部內存。
在Java 14做爲孵化API,在JDK15中第二次孵化。
以jdk.incubator.foreign
相同的名稱包形式提供了外部存儲器訪問API ;它引入了三個主要抽象:MemorySegment
,MemoryAddress
和MemoryLayout。
官方描述:
使用records加強Java編程語言,record 是充當不可變數據的透明載體的類。記錄能夠看做是名義元組。
equals
和訪問器。官方示例:
例如,先前聲明的記錄record Point(int x, int y) { }-將被編譯爲: record Point(int x, int y) { // Implicitly declared fields private final int x; private final int y; // Other implicit declarations elided ... // Implicitly declared canonical constructor Point(int x, int y) { this.x = x; this.y = y; } }
簡而言之:
似於lombok,主要目的是爲了簡化做用,不用再寫構造方法、equals,hashCode,toString等方法。
代碼示例:
1 public record Student(String name,int age) { 2 } 3 4 public class Main { 5 public static void main(String[] args) { 6 Student student = new Student("張三",20); 7 System.out.println(student); 8 System.out.println(student.name()); 9 System.out.println(student.age()); 10 } 11 }
官方描述:
棄用RMI激活 機制以便未來刪除。RMI激活是RMI的過期部分,自Java 8開始,RMI激活是可選的。不會棄用RMI的其餘部分。
改動緣由:
分佈式系統至少在過去十年中一直基於Web技術。Web服務領域已經解決了有關穿越防火牆,篩選請求,身份驗證和安全性的問題。延遲實例化資源由負載平衡器,業務流程和容器處理。這些機制在分佈式系統的RMI激活模型中均不存在。
RMI激活的使用量幾乎消失了。沒有證據代表有任何新的應用程序被編寫爲使用RMI激活,而且有證據代表不多有現有應用程序使用RMI激活。對各類開放源代碼庫的搜索幾乎沒有發現任何與激活相關的API。
間而言之:
RMI激活的功能使用極少,Web服務有更優秀的問題解決方案,RMI激活增長了維護的費用。
總的來講,JDK15新功能很少,能夠根據本身的實際須要,根據JDK版本功能走向來選擇合理的功能。