Java 10將於本月發布!

2017年8月,JCP執行委員會提出將Java的發佈頻率改為每六個月一次,隨後,Oracle發言人Donald Smith在他的博客中確認了這一消息。該決定將在Java 9正式發佈之後開始實行,也就是說,Java的下一個發佈日期是2018年3月。

新的發佈週期嚴格遵循時間點,將在每年的3月份和9月份發佈。與現在的發佈週期不同,新的發佈計劃不會為了等待某個主要特性完成而延期。如果一個特性還沒有完成,它就不會被合併到發佈用的代碼倉庫裡。如果錯過了一個版本,就要等待下一次發佈。在此之前,Java 8也因為安全問題延期了8個月左右,Java 9因為模塊化系統(Jigsaw)問題一再延期,比預期晚了18個月發佈。

也就是說,作為一個Java開發,你使用的編程語言,每半年都會有一個新的版本出來。這無疑是一件好事兒。

隨著新技術的不斷退出,對於開發者的挑戰也就越來越大。像我在我的文章中多次提到過的觀點:作為一個開發人員,最大的挑戰就是如何保證自己瞭解新的技術。

按照上面提到的Java發佈進度,Java 10將於本月發佈。因為Java 10的時間線較短,範圍也相對較小,所以Java 10的變更將通過JEP進行跟蹤。

有望被包含在Java 10中的特性是那些已經處於Targeted或Proposed狀態的JEP,它們包括:286:本地變量類型推斷

296:統一JDK倉庫

304:垃圾回收器接口

307:G1的並行Full GC

310:應用程序類數據共享

312:ThreadLocal握手機制

本文,主要來介紹一個特性:本地變量類型推斷。

因為他將改變你寫代碼的方式。

什麼是本地變量推斷

他其實是一個新的語法糖,在GitChat《深入分析Java語法糖》中我詳細介紹過目前Java中的所有語法糖及其背後的原理。Java現在在逐漸往多糖語言轉變,從Java 7開始便有意的開始加入語法糖。同樣,為了方便和簡化開發,Java 10將提供一個新的語法糖——本地變量類型推斷。

類型推斷,並不是Java語言獨有的特性,許多流行的編程語言,比如C++, C#以及Go,在定義過程中,都提供一種局部變量類型推斷的功能(例如C++提供了auto 關鍵字,C#提供var關鍵字)。

在當前版本的Java中,我們想定義定義局部變量時。我們需要在賦值的左側提供顯式類型,並在賦值的右邊提供實現類型,如下面的片段所示:

MyObject value = new MyObject();List list = new ArrayList();

在Java 10中,你可以這樣定義對象:

var value = new MyObject();var list = new ArrayList();

正如你所看到的,本地變量類型推斷將引入“var”關鍵字,而不需要顯式的規範變量的類型。很簡單,如果你想使用這個特性,就在你定義局部變量的時候引入var關鍵字就可以了。

在JEP 286誕生之前,Oracle曾做過一個調查,主要是想看看社區對於這一特性的反應。第一個調查是:你認為Java引入局部變量的類型推斷咋樣?

Java 10將於本月發佈!

第二個調查是:你希望使用哪個關鍵字來定義變量?

Java 10將於本月發佈!

從上面的兩個調查,我們可以知道,這一特性是受到廣大開發者歡迎的,因為他確實方便了很多。

他將如何影響你的代碼當一個新特性來臨的時候,我們首先要問自己一個問題:這將如何影響我的代碼? 下面我們來看下這一特性可以使用在哪些場景中,以及在哪些場景中不能使用。

適用範圍:

初始化局部變量

一定是初始化的時候,只是定義是不可以的。如var foo;不可以,但是var foo = "Foo";可以。

增強for循環的索引

如for (var nr : numbers)

傳統for循環的局部變量定義

如 for (var i = 0; i < numbers.size(); i++)

不適用範圍:

方法的參數

構造函數的參數

方法的返回值類型

對象的成員變量

只是定義定義而不初始化

總結

在Java 10之後你在聲明局部變量類型的時候可以使用var來告知編譯器進行類型推斷。這僅僅發生在變量初始化的階段,就像 var s = "";這樣。 此外,也可以是用在普通for循環和增強for循環中。

除了局部變量之外,另外在屬性和方法返回值類型中,不能使用var。 這樣做是為了避免引起一些無法預知的錯誤。

儘管引入var變量會使代碼可讀性變得更糟,但此次的新特性為開發者提供了一種在編寫複雜表達式的時候尋求了一個新的契機。


Java 10將於本月發佈!



分享到:


相關文章: