Java 9出現之后僅僅過去6個月,現在Java 10已經在敲門了。與它的版本號一樣,Java 10提供了10個新特性,本文提供了我認為重要的5個特性(您可以在Open JDK 10項目頁面上查看它們)。局部變量類型推斷是有爭議的熱點,但Java 10在JVM中的垃圾收集和容器識別上帶來了可喜的變化。
局部變量類型推斷是有爭議的熱點,但Java 10在JVM中的垃圾收集和容器識別上帶來了可喜的變化。
關于本系列
所以你認為你了解Java編程? 事實是,大多數開發人員只是浮于Java平臺的表面上,僅僅為了完成工作而學習。在這個正在進行的系列中,Java技術深入挖掘了Java平臺的核心功能,提出了一些技巧和訣竅,可以幫助你解決即使是棘手的編程挑戰。
Java™開發人員已經習慣了等待新的Java版本發布,但是新的、高頻率的發布節奏改變了這一情況。Java 9出現之后僅僅過去6個月,現在Java 10已經在敲門了。再過6個月,我們將迎來Java 11。一些開發人員可能會發現這樣的快速發布是多余的,但是新的節奏標志著一個長期需求的改變。
與它的版本號一樣,Java 10提供了10個新特性,本文提供了我認為重要的5個特性(您可以在Open JDK 10項目頁面上查看它們)。
1. Java的新版本節奏
從歷史上看,JDK發行的節奏是由大的新特性驅動的。作為近的例子,Java 8以lambda和流的形式引入了函數式編程,而Java 9引入了模塊化Java系統。每個新版本都被熱切地期待著,但是次要的修復程序經常束之高閣,等待更大的組件版本被終確定。Java的進化落后于其他語言。
新的高頻節奏將Java以更小的增量向前推進。在發布日期準備好的特性將被包括在內,而那些不能被安排在下一個版本中,就在6個月之后。在這個新周期下的第一個Java版本是Java 9,它于2017年10月發布。Java 10于2018年3月發布,Java 11將于2018年9月發布。
作為新節奏的一部分,甲骨文表示,它將只支持每個主要版本,直到下一個主要版本發布為止。 當Java 11發布時,Oracle將停止支持Java 10。支持Java版本的開發人員必須每6個月遷移一次主要版本。 不希望或不需要頻繁遷移的開發人員可以使用LTS(長期支持)版本,該版本每三年更新一次。 目前的LTS版本Java 8將在今年秋季發布Java 11之前得到支持。
2. 局部變量類型推斷
局部變量類型推斷是Java 10中顯著的特性。在進入JDK 10之前,爭論非常激烈,該特性允許編譯器推斷局部變量的類型,而不是要求程序員明確指定它。
使用局部變量類型
顧名思義,局部變量類型推斷功能僅適用于局部變量。 它不能用于定義實例或類變量,也不能用于方法參數或返回類型。 但是,您可以在類和增強型循環中使用var,可以從迭代器中推斷出類型
局部變量類型的問題
1. var掩蓋了類型
你已經看到了var如何提高代碼的可讀性,但是從另一方面來看,它也可以掩蓋它。
2. var不能與lambda一起使用
與lambda表達式一起使用時,類型推斷效果不佳,主要原因是編譯器缺少類型信息。 清單8中的lambda表達式不會被編譯。
3. var不會與菱形操作符混在一起
與菱形操作符一起使用時,類型推斷也不能很好地工作。
3、增加、刪除和棄用
刪除
Java 10刪除了很多工具:
命令行工具javah,可以使用javac -h代替。
命令行選項-X:prof,盡管可以使用jmap工具來訪問分析信息。
政策工具。
一些從Java1.2開始標記的為已棄用的API也被永久刪除了。包括java.lang.SecurityManager.inCheck字段和以下方法:
java.lang.SecurityManager.classDepth(java.lang.String)
java.lang.SecurityManager.classLoaderDepth()
java.lang.SecurityManager.currentClassLoader()
java.lang.SecurityManager.currentLoadedClass()
java.lang.SecurityManager.getInCheck()
java.lang.SecurityManager.inClass(java.lang.String)
java.lang.SecurityManager.inClassLoader()
java.lang.Runtime.getLocalizedInputStream(java.io.InputStream)
java.lang.Runtime.getLocalizedOutputStream(java.io.OutputStream)
棄用
JDK 10也棄用了一些API。 java.security.acl包已標記為已棄用,也包括java.security包中包含各種相關的類(Certificate,Identity,IdentityScope,Singer,auth.Policy)。
此外,javax.management.remote.rmi.RMIConnectorServer類中的CREDENTIAL_TYPES被標記為不建議使用。 java.io.FileInputStream和java.io.FileOutputStream中的finalize()方法已被標記為已棄用。所以在java.util.zip.Deflater / Inflater / ZipFileclasses中的finalize()方法也被棄用。
添加和包含
作為Oracle JDK和Open JDK正在進行對接的一部分,Open JDK現在包含Oracle JDK中可用的一部分根證書頒發機構。這些包括Java Flight Recorder和Java Mission Control。此外,JDK 10在java.text,java.time和java.util包的適當位置中增加了對BCP 47語言標記的Unicode擴展的增強支持。另一項新功能允許在不執行全局VM安全點的情況下執行線程回調。這使停止單個線程既可行又便宜,而不是要求你停止所有線程或不需要任何線程。
4.提高容器意識
如果你部署到像Docker這樣的容器,那么這個功能特別適合你。 現在JVM意識到它正在容器中運行,并查詢容器中可用處理器的數量,而不是查詢主機操作系統。 也可以從外部附加到在容器中運行的Java進程,這使監視JVM進程變得更加容易。
以前,JVM不知道它的容器,并會向主機操作系統詢問活動CPU的數量。 在某些情況下,這會導致JVM過度報告資源,導致多個容器在同一操作系統上運行時出現問題。 在Java 10中,您可以將容器配置為使用主機操作系統的CPU的子集,并且JVM將能夠確定正在使用的CPU數量。 您還可以使用-XX:ActiveProcessorCount標志明確指明能夠看到的容器化JVM處理器數量。(相關推薦:
)5.應用程序類數據共享
此特性的用途是提高運行間和多個運行相同代碼的JVM啟動時間,同時減少內存占用量。 這通過在JVM之間共享關于類的元數據來實現。 JVM的第一次運行收集并歸檔有關它所加載的類的數據。 然后它將數據文件提供給其他JVM以及該JVM的后續運行,從而節省JVM初始化過程中的時間和資源。 類數據共享實際上已經有一段時間了,但僅限于系統類。 現在這個功能已經擴展到包含所有的應用程序類。