Java 8發布Q&A
英文原文:Java 8 Launch Q&A
多年以來,Java 8 一直是最受期待的編程語言更新之一。這次發布的版本包含了日期 API、Streams API 和 Lambda。包括移除永久代(permgen)在內,還有一些不錯的改進。為了解該版本的更多信息,我們采訪了 Oracle Java 平臺組的軟件開發副總裁 Georges Saab。
InfoQ:對于我們中那些沒有緊跟Lambda項目的人,你可以就實現中涉及的內容給我們提供一些概念嗎?我想這是Java語言、虛擬機和類庫第一次這么協調的演進。
之前版本中,很多較大的特性都只影響了語言、虛擬機和類庫這三個領域中的某一個,或者是另一種情形,每個領域的改變都是經歷了一系列主要版本才引入的。
借助 Java 8 中的 Lambda,我們協調地對語言、類庫和 JVM 進行了修改,在開發過程中,每個領域都能夠影響和增強其他領域的設計與實現。
例如,我們在 JVM 上實驗了 Lambda 的不同備選方案,發現可以使用 InvokeDynamic。這個過程中我們發現可以通過 InvokeDynamic 加以改進。以自然的方式結合使用 Lambda 和集合類,這種期望引出了 Streams API 的設計,擴展方法也由此而來,而擴展方法又需要語言方面的支持。
這是一個歷經多年的演進過程,期間也有大量來自社區的極佳的反饋。
InfoQ:你認為Lambda的加入會把Groovy和Scala開發者帶回Java語言嗎?
有趣的是你提到的這兩種語言(還有很多其他語言)都運行在 JVM 上。實際上為支持 Java 之外的語言運行在 JVM 上,我們做了很多工作。而且我們認為,對語言實現者而言,哪些東西在 JVM 上表現很好,哪些表現不好,這方面的經驗他們還有很多要學的。當然實驗小眾語言比實驗大眾語言要容易得多。我們真正關注的是以深思熟慮、負責任的方式解決 能夠改進數百萬 Java 開發者工作的事情。
InfoQ:Lambda和Streams API的結合可以幫助我們開發清晰簡潔的代碼,但是像在過濾器后面跟一個過濾器這樣以函數式方式縮減一個集合的范圍,人們已經表露了對潛在的性能問題的擔憂。這種擔憂合理嗎?為緩解這種開銷引入了什么優化嗎?
Stream 支持中間操作(intermediate)和最終操作(terminal)。像過濾器這樣的中間操作實際上本身不執行任何過濾,相反,它們會創建一個新的 Stream,而這個 Stream 會在被遍歷到時提供被過濾 Stream 中匹配給定謂詞的元素。因此,一方面,創建額外的過濾器可能會致使運行時執行額外的工作。
另一方面,惰性處理 Stream,像所有中間操作都在 Stream 上做處理,會帶來很高的效率,比如多個操作可以合并到對數據的一遍處理中。結合底層強有力的 JVM 優化——Lambda 在設計時也是仔細考慮過支持 JVM 優化的,額外的過濾器的潛在影響會明顯減少。
另一個需要考慮的是,通過 Stream 和 Lambda,可以更輕松地使用并行。此外,對于用戶不是特別關心其相交順序的 Stream,減輕其順序約束對并行 Stream 上的操作可能有好處。
InfoQ:Java 8的另一個重要特性是Java類型上的注解支持開發可插入式的類型檢查器。你能多介紹一下嗎,比如你希望看到開發者使用該特性來處理哪類任務?
該特效支持在類型的名字上使用注解,可以使用這些類型的大部分地方都可以使用這種注解。作為這一變化的一個結果,開發者可以編寫注解,使用可插入式的類型檢查器在編譯時探測錯誤條件。社區正在為空指針錯誤、鎖和國際化問題開發這樣的檢查器和注解模式。
Prof. Michael Ernst 教授的 Checker 框架(checker-framework.org)是這方面信息和實現的一個很好的參考,該框架提供了十多個這樣的工具,其中一個是用于檢查空指針的檢查器。Michael 也擔任過 JSR 308 的聯席領導者,該語言特性就是在 JSR 308 中指定的。
如果能夠看到至少有一個這樣的注解機制在將來應用到 JDK 代碼庫中,我會很開心。而且當然,如果更廣大的 Java 開發者社區開始在他們自己的代碼庫中使用該技術,并為解決其軟件質量問題開發新的檢查器,也會讓人非常欣慰。
特別是在有關嵌入式和對安全要求很高的系統中,這種新方法允許在類型上加上重要屬性和約束,而且這些屬性和約束的使用可以用作編譯過程的一部分,還可以同時進行靜態分析。這為其他領域相關編程語言的用戶在將來遷移到 Java 平臺提供了一條途徑。
InfoQ:你認為在Java 8中對動態語言的最大增強體現在哪里?
那一定要說 HotSpot VM 中的性能改進了,特別是圍繞 invokedynamic 所做的工作。JDK 8 一個重要的新特性是 Nashorn JavaScript 引擎,這是一種流行動態語言的一個輕量級、高性能的實現。改進 Nashorn 的性能,幫我們在虛擬機中優化動態語言實現找到了新的機會。
此外,Nashorn 現在提供了一種非常方便的在 JavaScript 中使用 Java 的方式,支持以 JavaScript 編寫完整的 JavaFX 應用,并運行在 JVM 上。運行在 JVM 上的動態語言和 Java 之間那種透明的互操作性為編寫這樣的應用提供了一種強有力的方式。
InfoQ:對Java和安全的擔憂幾乎一直是去年的頭條新聞。Java 8對Java瀏覽器或其他地方有具體的改進嗎?
很多重要的安全改進和新特性已經作為 Oracle Java SE 7 更新的一部分交付了,包括部署規則集(Deployment Rule Sets)和異常站點列表(Exception Site Lists)。維護 Java 的安全是我們的第一要務。
此外,Java SE 8 包含了一些新的安全特性。最明顯的可能是傳輸層安全(Transport Layer Security)實現的增強:現在平臺默認支持 TLS 1.2。除了全面的安全 API,還有很多其他增強,包括從證書撤銷檢查改進到新的加密算法。
InfoQ:你是否知道使用 Java 5、6和7的Java開發者比例?在加速Java 8的采用方面有什么計劃嗎?
在過去的 6 至 9 個月,我在世界各地的會議上發表過演講,每次我都會問人們正在使用哪個版本。基于這種非正式且不夠科學的調查,大部分 Java 開發者目前在使用 Java SE 7,仍在使用 Java 6 的明顯屬于少數(但不可忽略),還有少數人使用更老的版本。從開發者的角度看,Java SE 8 以新的語言特性和 API 的形式為快速采用帶來了充足的理由。隨著像 NetBeans、Eclipse 和 IntelliJ IDEA 等 IDE 努力在即將發布的版本中提供支持這些特性的良好工具,我預計開發者會快速擁抱 Java SE 8。
InfoQ:去年的JavaOne,最大的主題之一就圍繞Java ME、SE和EE的統一。Java 8在這個方向上走到什么程度了?
在 Java SE 8 的眾多特性之中,有一個特性就是支持緊湊配置(Compact Profiles)。它們定義了 Java SE 平臺規范的一些子集配置,支持部署不需要完整平臺、運行在小型設備上的應用。結合 HotSpot 中的其他改進,比如減少類的元數據的內存占用,以及從整體上減少虛擬機內存占用,該特性支持 JDK 8 針對小型設備上的應用開發與部署按比例縮減。為進一步簡化這一點,JDK 8 中包含了一個新工具jdeps,支持開發者找出其代碼依賴的配置。
而另一個方向,Java ME 8 也正在增強,包含的語言特性、虛擬機和類庫更為接近 Java SE 8 了。盡管你不能馬上在 Java ME 8 代碼中使用 Lambda,但是該平臺現在支持 Java SE 5、6 和 7 中引入的語言構造,比如斷言、泛型、枚舉、在 switch 中使用字符串、try-with-resources 語句和菱形操作符。類似地,核心類庫也做了更新,支持現代 Web 協議,像 IPv6,也支持高級安全特性,包括支持 TLS 1.2。與過去相比,Java SE 和 Java ME 兩個平臺走得更近了。
InfoQ:何時能看到Stripped Implementations加入Java中?
在 Java SE 8 發布之后,我們需要再看一下如何將該特性在 Java SE 9 之前的某個版本加入到平臺中。這并非技術問題,而是事關如何確保規范文本和相關法律框架支持相應的用例,同時避免 Java 平臺分裂。
非常感謝 Georges 回答我們的問題。Oracle 會通過 網絡直播方式正式介紹 Java,屆時 InfoQ 還會進行相關報道。
來自: InfoQ