摘要:的問題在于,版本號中編碼了它和它對之前版本的兼容性信息。但是在六個月節奏的情況下,這些信息都是未知的,在發布前任何事情都可能發生,由此規范下的版本號也會是未知的。程序會對文件的完整性做一個保護,因此修改既可能丟失。
本文是對底部參考資料的整理得到的,由于本人技術水平和英語水平都不是很高,有些詞如有翻譯錯誤或句子的理解錯誤還請指出。JEP 286 局部變量推斷: var
傳統的 Java 代碼中,聲明一個變量是非常繁瑣的:
Listlist = new ArrayList ();
現在則引入了 var,既保持 Java 對靜態類型安全的承諾,又能讓開發者省略不必要的局部變量類型的聲明。
比如像這樣:
var list = new ArrayList();
var 只能用在以下情況:
聲明的同時賦值,比如上面那個例子
增強的 for 循環中的索引 (這將在后面提到)
傳統 for 循環中聲明的本地變量
它不能被用于方法簽名、構造器聲明、方法返回類型、字段、異常捕獲或任何其他類型的變量聲明。
類型推斷在 Java 8 中已經得到了顯著的擴展,包括了對嵌套和鏈接的泛型方法的推導以及 lambda 表達式的推導,比如下面這樣:
int maxWeight = blocks.stream() .filter(b -> b.getColor() == BLUE) .mapToInt(Block::getWeight) .max();
沒有必要去在意 blocks.stream*() 返回的是 Stream
對于局部類型變量,類型推導是非常有用的,因為通常情況下都可以寫成下面這種代碼:
var path = Paths.get(fileName); var bytes = Files.readAllBytes(path);
但是要注意的是,var 并不是一個關鍵字,而是一個保留的類型名稱,這意味著你可以將一個變量、方法、包名寫成 var 。不過一般情況下不會有人這么寫的,因為這本身就違反了普遍的命名規范。
var 不能用來聲明沒有賦值的變量、不能用于聲明多個變量的情況、不能聲明具有額外緯度的數組或引用了正在初始化的其他變量的變量。
JEP 322 基于時間的版本號管理JEP 223 引入的版本號方案相比之前的方法都要好很多,但是對于現在 Java 所走的 六個月節奏 并不適合。
JEP 223 的問題在于,版本號中編碼了它和它對之前版本的兼容性信息。但是在 六個月節奏 的情況下,這些信息都是未知的,在發布前任何事情都可能發生,由此 JEP 223 規范下的版本號也會是未知的。
在 JEP 223 的語義中,每個基于 JDK 構建或使用組件的開發者(包括 JDK 的發布者)都必須提前敲定版本號,然后切換過去。而庫、框架和工具的開發者則必須在代碼中修改檢查版本號的相關代碼,這造成了混亂。
更多關于 JEP 322 的詳細情況請訪問這里。
core-libs/java.util Optional.orElseThrow() 方法此次更新中為 Optional 類添加了一個新的方法,這個方法與 orElseThrow(exSupplier) 是不同的,它沒有參數。
Optional.get() 是一個容易誤導程序員的方法,它實際上有可能拋出 NoSuchElementException 運行時異常,因此需要一個語義明確的方法來幫助程序員清楚的認識到自己在做什么。
在之前的規劃中,Optional.getWhenPresent() 是一個備選方法,雖然這個名字強調了值一定會存在,但是其中的 when 似乎會讓人覺得這是個阻塞方法。因此最后委員會選擇了 Optional.orElseThrow(),但是 Optional.get() 并沒有被單純得棄用。
Unicode 標簽擴展增強了 java.util.Locale 和相關 API 以實現關于 BCP 47 語言標簽 的 Unicode 擴展。
詳情請訪問這里
core-libs/java.util 創建不可變集合的一系列 API新的 API 中包括了一些用于創建不可見集合的方法:
List.copyOf、Set.copyOf 和 Map.copyOf() 可以用來從已有的集合中創建一個新的集合;
toUnmodifiableList、toUnmodifiableSet 和 toUnmodifiableMap 則存在于 Stream.Collectors 類中,通過它們可以將流的元素收集到一個不可變集合當中。
copyOf 系列的方法簽名基本是下面這樣:
staticList copyOf (Collection extends T> coll)
Set 和 Map 也會有類似的方法。
值得注意的是,這個方法會檢測 coll 是不是一個 不可變 的集合,如果是,則會直接返回該引用,相當于一個淺拷貝。
另外對于不可變集合而言,下面這種情況是被允許的:
Listlist = List.of(...); List newList = List.copyOf(list);
這對于可變集合而言是不允許的,因為這可能會導致堆污染。
core-svc/java.lang.management 用于關閉 JRE Last Usage Tracking 的系統屬性引入了新的 jdk.disableLastUsageTracking 屬性以禁用 JVM 的 JRE 上次使用情況追蹤 功能。
如果使用了此屬性,那么 com.oracle.usagetracker.track.last.usage 的設置將被忽略。
core-svc/java.lang.management 開箱即用的 JMX 代理使用的散列密碼在以前,JMX 存儲的是明文密碼,當時 (2014 年) 大家已經開始手動生成散列密碼來替換明文密碼,因為這可以避免一些攻擊,同時鹽 (salt) 的存在可以讓散列密碼的強度更上一層。但是對于管理員而言,即使是使用諸如 Python 之類的腳本語言來生成散列密碼,這仍然是極容易出錯的。因此最好的辦法是用戶只需要提供明文密碼,讓 JMX 來處理散列之類的事情。
JMX 現在會使用密碼的 SHA3-512 散列結果來覆蓋存儲在 jmxremote.password 中的明文密碼。
其格式如下:
role_name W hashedPassword
其中:
role_name 是任何不含空格或制表符的字符串
W 是一個空格或制表符
散列密碼的格式如下:
hashedPassword = base64_encoded_64_byte_salt W base64_encoded_hash W hash_algorithm
其中:
base64_encoded_64_byte_salt 是 64字節的隨機值
base64_encoded_hash 是 Hash_algorithm(password + salt) 的結果
W 是一個空格或制表符
hash_algorithm 是列表 中指定的算法名稱。這是個可選項,默認值為 SHA3-512
如果密碼是明文的,且滿足以下條件,那么將被散列值覆蓋
management.properties 文件中 com.sun.management.jmxremote.password.toHashes 屬性被設為 true
密碼文件是可寫的
安全管理器處于打開狀態的情況下系統安全策略允許對密碼文件進行寫入
如果想更改角色的密碼,可以將舊的散列密碼替換為新的明文密碼或新的散列密碼。如果新的密碼是明文的,那么在新的登錄發生時系統會使用其散列值替換明文密碼。
文件中的角色應該至少有一條記錄,否則該角色將無權訪問;如果同一個用戶下有多條記錄,那么會使用最后一條記錄。
用戶可以自行根據上述的格式來生成的散列值,以替換舊的密碼。
文件被擁有者以外的用戶訪問時將導致錯誤并退出程序。
為了防止在生產環境中對密碼文件進行了無意的編輯,建議只部署可讀的散列密碼文件。明文密碼的散列密碼列表可以用 JMX 代理預先生成。
在 JMX 運行期間,建議不要編輯密碼文件。程序會對文件的完整性做一個保護,因此修改既可能丟失。
hotspot/gc JEP 307 G1 的 完全并行 GCG1 垃圾收集器就是為了避免 完全 GC (full collections) , 但是當并行收集無法快速回收內存時,會產生一次 完全回退 GC (fall back full GC) 。
之前 G1 的 完全GC 使用的是單線程標記掃描壓縮算法(mark-sweep-compact),現在通過 JEP 307,完全GC 得以并行化,同時現在會使用與 年輕代 、混合收集 相同的并行工作線程數量。
security-libs/java.security JEP 319 根證書OpenJDK 中的 cacerts 密鑰庫在相當長一段時間內是空的,這將導致未指定 javax.net.ssl.trustStore 屬性的情況下 TLS 連接 的創建會被阻止。現在Oracle 的 Java SE 根證書 被填充至 OpenJDK 的 cacerts 中。
security-libs/javax.net.ssl TLS 會話散列 和 主密鑰擴展 的支持在是一個對 RFC 7627 的支持。
如果出現兼容問題,可以將 jdk.tls.useExtendedMasterSecret 設置為 false 來禁用此擴展的協商。
如果 jdk.tls.allowLegacyResumption 值為 false,當會話散列和主密鑰擴展未協商的情況下,程序可以拒絕簡短握手。
如果 jdk.tls.allowLegacyMasterSecret 值為 false,應用將拒絕不支持此擴展的連接。
tools/javac 增強 for 循環的字節碼生成之前的 for 循環在遍歷一個大的列表/數組時,它會隱式得持有一個臨時引用,而且這個臨時引用不會被釋放以至于可能產生 OutOfMemoryError 異常,詳細的情況可以查看這里。
對于下面的 Java 代碼:
Listdata = new ArrayList<>(); for (String b : data);
將會被編譯為:
{ /*synthetic*/ Iterator i$ = data.iterator(); for (; i$.hasNext(); ) { String b = (String) i$.next(); } b = null; i$ = null; }
這意味著 GC 可以發現不再被使用的 i$ 所占用的內存并回收它,這對于數組也是適用的。
tools/javadoc(tool) javadoc 支持多個樣式表新的 javadoc 命令行選項 --add-stylesheet ,它支持在生產的文檔中使用多個樣式表。
而現有的選項 -stylesheetfile 有了一個別名 stylesheetfile --main-stylesheet,用以區分主樣式表和其他樣式表,更多信息可以查看 javadoc 文檔。
tools/javadoc(tool) 覆寫沒有改變規范的方法默認情況下,如果有方法覆寫了超類中的方法,那么 javadoc 會為它生成文檔。
但是如果一個方法只是被覆寫但是沒有改變語義行為時,javadoc 只會在原方法摘要中用 @inheritdoc 標記它。
現在新的選項 --overridden-methods=value 可以將許多 不改變規范的覆寫方法 與其他繼承而來的方法分組,而不是在類的聲明中與其他方法一起被記錄在文檔中。
tools/javadoc(tool) API 描述中摘要的注釋標記{@summary ...} 是一個新的行內標記。默認情況下,會通過簡單算法或 java.text.BreakIterator 對描述中的第一句話進行判斷以確定 API 描述內容的摘要,但是這種方法可能會對第一句話結尾有錯誤的判斷,因此新的標簽可以顯式得指定 API 的描述摘要。
參考資料
JDK 10 Release Notes
Java SE 10 (18.3) (?JSR 383) Final Release Specification
JEP 286 Local-Variable Type Inference
JEP 322: Time-Based Release Versioning
JEP 314: Additional Unicode Language-Tag Extensions
JDK-8140281 : (opt) add no-arg orElseThrow() as preferred alternative to get()
JDK-8177290 : add copy factory methods for unmodifiable List, Set, Map
JDK-5016517 : Replace plaintext passwords by hashed passwords for out-of-the-box JMX Agent
JDK-8172890 : JEP 307: Parallel Full GC for G1
JDK-8189131 : Open-source the Oracle JDK Root Certificates
JDK-8148421 : Transport Layer Security (TLS) Session Hash and Extended Master Secret Extension
JDK-8175883 : bytecode generated for the enhanced for loop may block memory garbage collecting
JDK-8185371 : Support for multiple stylesheets in javadoc
JDK-8157000 : Do not generate javadoc for overridden method with no spec change
JDK-8173425 : Javadoc needs a new tag to specify the summary.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76337.html
摘要:于是抽時間看了看以后各個版本的特性,做了一個總結。年和公開版本發布,取名為。此后對應版本就是,。發布,是一個重大版本更新。在此之后,就是每六個月發布一次新版本。以上和參考資料聊了一些關于的歷史,下面我們看看各個版本有那些新特性。 【這是 ZY 第 11 篇原創技術文章】 某天在網上閑逛,突然看到有篇介紹 Java 11 新特性的文章,頓時心里一驚,畢竟我對于 Java 的版本認識...
摘要:的新特性說了這么多,看都會有哪些特性來改變我們寫代碼的方式呢局部變量類型推斷局部變量類型推斷可以說是中最值得注意的特性,這是語言開發人員為了簡化應用程序的編寫而采取的又一步,如下圖所示。 showImg(https://segmentfault.com/img/remote/1460000015356980); Java 9才發布幾個月,很多玩意都沒整明白,現在Java 10又快要來了...
摘要:的這個特性新增了兩個參數分別是及,設置為的話,表示禁用。語法層面引入了版本的層面引入了,引入,讓支持,對等新增方法方面引入了版本的,不過的沒有另外主要對及進行了改進其中對支持了,默認是開啟,使用可以禁用對于則新增支持以及特性 Java語言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新...
摘要:和同步發布的是的。和支持,包括現成的和配置及數據源。更加靈活的提示,可以禁用和啟用該提示并更改警告級別。導航器顯示目標。新的測試運行器支持。新的修復程序支持。版本控制增強功能支持工作副本,各種和支持增強功能。 和Java8同步發布的是Oracle的NetBeansIDE 8。NetBeans IDE 8.0 提供了現成的代碼分析器和編輯器,可在其中使用最新的 Java 8 技術 -- ...
摘要:最近連都在準備發布的路上了,大家都整明白了嗎也許現在大部分人還在用,的新特性都沒用熟,剛出不久,就不用說了。 最近連 JDK11都在準備發布的路上了,大家都整明白了嗎?也許現在大部分人還在用6-8,8的新特性都沒用熟,9剛出不久,10-11就不用說了。 為了大家對JDK有一個全面的了解,下面我為大家整理了JDK5~10的所有關鍵新特性! JDK5新特性 自動裝箱與拆箱 枚舉 靜態導...
閱讀 2830·2021-11-24 09:39
閱讀 4082·2021-10-27 14:19
閱讀 2043·2021-08-12 13:25
閱讀 2334·2019-08-29 17:07
閱讀 1112·2019-08-29 13:44
閱讀 1066·2019-08-26 12:17
閱讀 462·2019-08-23 17:16
閱讀 2048·2019-08-23 16:46