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