新聞中心
在10月22的 Oracle Codeone大會上,Java平臺的***架構(gòu)師 Mark Reinhold 做了The Future of Java is Today的演講, 回顧了最近Java的幾個版本的新的功能,Java的每年兩次的發(fā)布周期, 澄清了關(guān)于發(fā)布流程和Java版本的幾個誤區(qū),***花了很大的篇幅介紹了未來Java幾個令人非常期待的幾個孵化中項目,可以為Java帶來更好的生產(chǎn)力、性能和可擴展性。我整理了這四個項目相關(guān)的知識,你可以提前了解到Java未來的這些酷炫的特性。

成都創(chuàng)新互聯(lián)服務(wù)項目包括洛南網(wǎng)站建設(shè)、洛南網(wǎng)站制作、洛南網(wǎng)頁制作以及洛南網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,洛南網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到洛南省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
Java各版本的發(fā)布時間點和LTS版本
Mark Reinhold 我不多介紹了, 之前要了解Java的未來動向看Java之父James Gosling, 他離開Oracle之后想了解Java的動向就看 Mark Reinhold。
[[247533]]
Project Amber
提供面向生產(chǎn)力的Java特性, 比如字符串字面值、switch表達(dá)式、模式匹配、record等
這個項目包含很多Java語言特性的新功能。
包括:
正在實現(xiàn)的:
- JEP 302 Lambda Leftovers: 對lambda功能的補強, 比如下劃線變量等BiFunction biss = (i, _) -> String.valueOf(i);, lambda參數(shù)的Shadowing,消除一些歧義等修補工作
- JEP 305 Pattern Matching: 這個功能非常好,Scala和kotlin中的模式匹配非常強大,這個jep提供了類似的功能,配合switch和record,可以大大簡化條件分支的處理,如:
- int eval(Node n) {
- switch(n) {
- case IntNode(int i): return i;
- case NegNode(Node n): return -eval(n);
- case AddNode(Node left, Node right): return eval(left) + eval(right);
- case MulNode(Node left, Node right): return eval(left) * eval(right);
- default: throw new IllegalStateException(n);
- };
- }
數(shù)據(jù)類,一行定義,省去了字段、字段訪問方法和hash、equals、toString等方法,定義ValueObject簡化到家了:
- record Point(int x, int y);
- JEP 325 Switch Expressions (preview, JDK 12): 當(dāng)前的switch是什么, 語句。這個jep擴展switch,并且可以作為表達(dá)式使用:
- int numLetters = switch (day) {
- case MONDAY, FRIDAY, SUNDAY -> 6;
- case TUESDAY -> 7;
- case THURSDAY, SATURDAY -> 8;
- case WEDNESDAY -> 9;
- };
- JEP 326 Raw String Literals (preview, JDK 12): 這個很多語言中都實現(xiàn)了,可以更好的書寫字符串字面值, 尤其在正則表達(dá)式中處理很多轉(zhuǎn)義符的時候,和Go類似:
- String s = `
- this is my
- embedded string
- `;
- JEP draft 8209434 Concise Method Bodies: 正常的方法定義以大括號包裹,這個特性提供了類似Lambda表達(dá)式簡化方式的形式,直接單行定義方法體, 類似C#和kotlin的特性:
- class MyList
implements List { - private List
aList; - public int size() = aList::size;
- public T get(int index) = aList::get;
- ...
- }
已發(fā)布的:
- JEP 286 Local-Variable Type Inference (var) (JDK 10): 本地變量的類型推斷, 也就是使用var定義變量,有些同學(xué)已經(jīng)用起來了,非常的方便,有點類似動態(tài)類型的語言,感覺雖然還沒有達(dá)到Scala那么靈活,已經(jīng)很不錯了
- JEP 323 Local-Variable Syntax for Lambda Parameters (JDK 11): 對本地變量的類型推斷的加強,用在Lambda表達(dá)式中。
暫時擱置的:
- JEP 301 Enhanced Enums.
總之,每一個特性都可以大大簡化我們的開發(fā),讓Java更像一個"現(xiàn)代的"編程語言。
Project Loom
提供一個輕量級的用戶態(tài)的纖程,叫做fiber,更加簡化并發(fā)編程,而且更有效
這個特性多年前我介紹過: https://colobu.com/2016/08/01/talk-about-quasar-again/,當(dāng)時它還像一個玩具,開發(fā)的時候很麻煩,而且有一些坑。作者后來負(fù)責(zé)這個jep,可以很好的從java實現(xiàn)的角度去實現(xiàn)fiber,所以很是期待。
[[247534]]
Mark Reinhold 首先使用jshell演示了fiber的使用,一兩行程序就可以做到,我覺得方便性可以和goroutine相媲美了。他接著使用一個restful的例子比較了Thread和Fiber的性能, restful服務(wù)收到請求后暫停100毫秒,模擬一個慢的io操作,結(jié)果顯示Thread很很多幾百毫秒的尖峰,而fiber在預(yù)熱之后一直穩(wěn)定在100毫秒。 這絕對是Java程序員值的關(guān)注一個新特性。
例子使用jetty做服務(wù)器,線程池執(zhí)行命令的時候讓fiber去調(diào)度,這種方式對現(xiàn)有的代碼改動很小。
我比較關(guān)注的是如果它的內(nèi)部調(diào)度算法怎么實現(xiàn)的,另外,一個包含復(fù)雜業(yè)務(wù)完成時間較長的fiber是否能被調(diào)度器自動調(diào)度,以便使用有限的線程調(diào)度其它的fiber, 類似goroutine在系統(tǒng)調(diào)用的時候自動插入檢查點。
Project Panama
提升JVM和外部(非java)代碼和數(shù)據(jù)聯(lián)系
當(dāng)然,這個項目不僅僅是簡化JNI的開發(fā),而且提供了很多的特性:
- native function calling from JVM (C, C++), specifically per JEP 191
- native data access from JVM or inside JVM heap
- new data layouts in JVM heap
- native metadata definition for JVM
- header file API extraction tools (see below)
- native library management APIs
- native-oriented interpreter and runtime “hooks”
- class and method resolution “hooks”
- native-oriented JIT optimizations
- tooling or wrapper interposition for safety
- exploratory work with difficult-to-integrate native libraries
Mark Reinhold在演講中舉了兩個例子,首先是為 POSIX 操作系統(tǒng) API 的頭文件unistd.h中的函數(shù)生成Java的可訪問代碼。
jextract工具會生成一堆的函數(shù)和類型,關(guān)鍵這些是從c的頭文件中自動生成的,你不必費勁心思去自己設(shè)計類型和方法了。這一點比Go語言中的CGO要方便多了,快捷度可以和C#互操作性相媲美。
所以以后你要是想從Java中訪問C的鏈接庫,可以使用jextract一步生成,
調(diào)用方法也很方便。
另一個例子是調(diào)用C標(biāo)準(zhǔn)庫time.h中的clock_gettime函數(shù),它的參數(shù)需要struct類型,使用上面相同的手段可以生成訪問類:
當(dāng)然這兩個例子只演示了這個項目的一個功能,更多的功能我們可以持續(xù)關(guān)注。
Project Valhalla
包含兩個feature: 值類型和基本類型的泛型。
- 值類型:提供不可變類型和非引用類型的支持。不可變類型在Scala中很常用,java中也會引進這中類型。使用這種類型有很多好處,一個就是可以顯著地提高性能,因為數(shù)據(jù)不可變,你也不必?fù)?dān)心同步更新的問題。
- 基本類型的泛型: 為primitive type提供泛型的支持,不必再進行裝箱開箱操作。
Mark Reinhold用一個復(fù)數(shù)矩陣相乘的例子來測試,測試工具使用JMH。
首先是正常的public class Complex {...}類,然后改成值類型public value class Complex{...}再次測試,結(jié)果顯示,
正常測試花費3.6秒內(nèi)存分配3.7G;值類型則只需要0.3秒花費3.8M左右,效果驚人!
目前這些特性還在開發(fā)之中,Mark Reinhold用java12 + 這些項目已經(jīng)能跑一些例子了,我們可以期待不遠(yuǎn)的將來能在Java中使用到這些美妙的特性。
名稱欄目:Java:未來已來這些炫酷特性你確定不看嗎?
當(dāng)前網(wǎng)址:http://m.5511xx.com/article/dpgscij.html


咨詢
建站咨詢
