自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java 8那些被冷落的新特性

開發(fā) 后端
lambda表達(dá)式,lambda表達(dá)式,還是lambda表達(dá)式。一提到Java 8就只能聽到這個(gè),但這不過(guò)是其中的一個(gè)新功能而已,Java 8還有許多新的特性——有一些功能強(qiáng)大的新類或者新的用法,還有一些功能則是早就應(yīng)該加到Java里了。

lambda表達(dá)式,lambda表達(dá)式,還是lambda表達(dá)式。一提到Java 8就只能聽到這個(gè),但這不過(guò)是其中的一個(gè)新功能而已,Java 8還有許多新的特性——有一些功能強(qiáng)大的新類或者新的用法,還有一些功能則是早就應(yīng)該加到Java里了。

這里我準(zhǔn)備介紹它的10個(gè)我個(gè)人認(rèn)為非常值得了解的新特性。總會(huì)有一款適合你的,開始來(lái)看下吧。

  • default方法

這是Java語(yǔ)言的一個(gè)新特性,現(xiàn)在接口類里可以包含方法體(這就是default方法)了。這些方法會(huì)隱式的添加到實(shí)現(xiàn)這個(gè)接口的每個(gè)子類中。

這使得你可以在不破壞代碼的前提下擴(kuò)展原有庫(kù)的功能。它絕對(duì)是個(gè)利器。但從另一個(gè)方面來(lái)說(shuō),這使得接口作為協(xié)議,類作為具體實(shí)現(xiàn)的界限開始變得有點(diǎn)模糊。但好處就是,它通過(guò)一個(gè)很優(yōu)雅的方式使得接口變得更智能,同時(shí)還避免了代碼冗余,并且擴(kuò)展類庫(kù)。不好的地方就是,我估計(jì)很快就會(huì)看到有在接口方法里獲取this引用然后強(qiáng)制轉(zhuǎn)化成某個(gè)具體類型的寫法了。

  • 終止進(jìn)程

一旦啟動(dòng)外部進(jìn)程的話,當(dāng)這個(gè)進(jìn)程崩潰,掛起,或者CPU到達(dá)100%的時(shí)候,你就得回來(lái)擦屁股了。Process類現(xiàn)在增加了兩個(gè)新的方法,可以來(lái)教訓(xùn)下那些不聽話的進(jìn)程了。

第一個(gè)是isAlive()方法,有了它你可以判斷進(jìn)程是否還活著。第二個(gè)方法則更加強(qiáng)大,它叫destroyForcibly(),你可以用它來(lái)強(qiáng)制的殺掉一個(gè)已經(jīng)超時(shí)或者不再需要的進(jìn)程。

  • StampedLock

提到這個(gè)不禁有點(diǎn)小激動(dòng)。沒(méi)有人會(huì)喜歡在代碼中使用同步。用了它肯定會(huì)降低程序的吞吐量,更糟糕的話還會(huì)導(dǎo)致進(jìn)程掛起。盡管這樣,有時(shí)候你卻不得不選擇它。

當(dāng)多個(gè)進(jìn)程訪問(wèn)一個(gè)資源的時(shí)候,有多種方法可以進(jìn)行同步。其中用得最多的一種是ReadWriteLock以及基于它的幾種實(shí)現(xiàn)。它通過(guò)阻塞寫線程的方式來(lái)允許多個(gè)線程并發(fā)的讀,這樣減少了線程之間的競(jìng)爭(zhēng)。聽起來(lái)還不錯(cuò),但實(shí)際上這個(gè)鎖實(shí)在是太太太慢了,尤其是當(dāng)有許多寫線程的時(shí)候。

因此Java 8引入了一個(gè)新的讀寫鎖,叫做StampedLock。它不僅更快,同時(shí)還提供了一系列強(qiáng)大的API來(lái)實(shí)現(xiàn)樂(lè)觀鎖,這樣如果沒(méi)有寫操作在訪問(wèn)臨界區(qū)域的話,你只需很低的開銷就能獲取到一個(gè)讀鎖。訪問(wèn)結(jié)束后你可以查詢鎖來(lái)判斷這期間是否發(fā)生了寫操作,如果有的話再選擇進(jìn)行重試,升級(jí)鎖,或者放棄這個(gè)操作。

這的確是一個(gè)非常強(qiáng)大的工具,它本身就值得專門花一篇文章來(lái)介紹。這個(gè)新玩意兒讓我感到非常激動(dòng)和興奮,它真的是太棒了。

想了解更多請(qǐng)點(diǎn)擊這里。

  • 并發(fā)計(jì)數(shù)器

這是多線程程序會(huì)用到的另一個(gè)小工具。它提供了簡(jiǎn)單高效的新接口來(lái)實(shí)現(xiàn)多線程的并發(fā)讀寫計(jì)數(shù)器的功能,和AtomicInteger比起來(lái),它要更快一些。相當(dāng)贊的工具。

  • Optional

不好,又有空指針了,這是所有Java開發(fā)人員的痛處。這估計(jì)是有史以來(lái)最常見的異常了,至少是1965年以來(lái)。

Java 8借鑒了Scala和Haskell,提供了一個(gè)新的Optional模板,可以用它來(lái)封裝可能為空的引用。這絕不是終結(jié)空指針的銀彈,更多只是使API的設(shè)計(jì)者可以在代碼層面聲明一個(gè)方法可能會(huì)返回空值,調(diào)用方應(yīng)該注意這種情況。正因?yàn)檫@個(gè),這只對(duì)新的API有效,前提是調(diào)用方不要讓引用逃逸出封裝類,否則的話引用可能會(huì)在外面被不安全的廢棄掉。

我對(duì)這個(gè)新的特性真的是又愛(ài)又恨。一方面,空指針是一個(gè)大問(wèn)題,只要能解決這個(gè)問(wèn)題的東西我都?xì)g迎。但另一方面,我對(duì)它是否能擔(dān)此重任執(zhí)懷疑的態(tài)度。這是由于使用它的話需要全公司的集體努力,短期內(nèi)很難會(huì)有見效。除非大力地推廣,否則很可能會(huì)功虧一簣。

  • 萬(wàn)物皆可注解

還有一個(gè)小的改進(jìn)就是現(xiàn)在Java注解可以支持任意類型了。之前只有像類和方法聲明之類的才能使用注解。在Java 8里面,當(dāng)類型轉(zhuǎn)化甚至分配新對(duì)象的時(shí)候,都可以在聲明變量或者參數(shù)的時(shí)候使用注解。這是Java為了更好地支持靜態(tài)分析及檢測(cè)工具(比如FireBug)而做的工作中的一部分。這是個(gè)很不錯(cuò)的特性,但是和Java 7的invokeDynamic一樣,它的真正價(jià)值取決于社區(qū)以后如何去使用它。

  • 數(shù)值溢出

這些方法早就該出現(xiàn)在Java的核心類庫(kù)里了。我有個(gè)癖好就是去測(cè)試整型超出2^32時(shí)溢出的情況,搞出一些惡心的隨機(jī)BUG來(lái)(怎么會(huì)得到這么奇怪的一個(gè)值?)。

同樣的,這也不是什么銀彈,只不過(guò)是提供了一組函數(shù),這樣你在使用+/*操作符進(jìn)行數(shù)值操作的時(shí)候,如果出現(xiàn)了溢出,會(huì)拋一個(gè)異常。如果我可以決定的話,我會(huì)把它作為JVM的默認(rèn)模式,顯式的標(biāo)明函數(shù)會(huì)出現(xiàn)數(shù)值溢出。

  • 目錄遍歷

遍歷目錄樹這種事通常都得上Google搜下怎么實(shí)現(xiàn)(你很可能用的是Apache.FileUtils)。Java 8給Files類做了一次整容手術(shù),增加了十個(gè)新的方法。我最喜歡的一個(gè)是walk()方法,它遍歷目錄后會(huì)創(chuàng)建出一個(gè)惰性的流(文件系統(tǒng)很大的情況下非常有用)。

  • 增強(qiáng)的隨機(jī)數(shù)生成

現(xiàn)在經(jīng)常都在討論密碼或者密鑰容易遭受攻擊的事。程序的安全性是項(xiàng)很復(fù)雜的工程,并且很容易出錯(cuò)。這就是我為什么喜歡這個(gè)新的SecureRandom.getinstanceStrong()方法的原因,它能自動(dòng)選擇出當(dāng)前JVM可用的最佳的隨機(jī)數(shù)生成器。這樣減少了獲取失敗的機(jī)率,同時(shí)也避免了默認(rèn)的弱隨機(jī)數(shù)生成器可能會(huì)導(dǎo)致密鑰或者加密值容易被黑客攻破的問(wèn)題。

  • Date.toInstant()

Java 8引入了一個(gè)新的日期API。這不難理解,因?yàn)楝F(xiàn)有的這個(gè)實(shí)在是太難用了。實(shí)際上Joda一直以來(lái)都是Java日期API的首選。不過(guò)盡管有了新的API,但仍有一個(gè)嚴(yán)重的問(wèn)題——大量的舊代碼和庫(kù)仍然在使用老的API。

并且我們還知道這種現(xiàn)狀仍將繼續(xù)存在下去。到底該怎么做呢?

Java 8很優(yōu)雅的解決了這個(gè)問(wèn)題,它給Date類增加了一個(gè)新的方法toInstant(),它可以將Date轉(zhuǎn)化成新的實(shí)現(xiàn)。這樣你馬上就可以切換到新的API,盡管現(xiàn)有的代碼還在使用老的日期API(并且在可預(yù)見的未來(lái)仍將繼續(xù)這樣)。

如果你覺(jué)得有什么遺漏的或者你覺(jué)得我有什么講的不對(duì)的地方,請(qǐng)不吝賜教。下面的評(píng)論框就是為這個(gè)而準(zhǔn)備的:-)

原文鏈接:http://it.deepinmind.com/java/2014/05/03/10-features-in-java-8-you-havent-heard-of.html

責(zé)任編輯:林師授 來(lái)源: deepinmind
相關(guān)推薦

2021-02-22 11:51:15

Java開發(fā)代碼

2014-07-15 14:48:26

Java8

2014-10-20 13:57:59

JavaFX 8Java 8

2019-10-31 15:37:29

Android Q

2013-05-02 09:14:19

Java 8Java 8的新特性

2014-04-16 07:43:31

Java 8JRE

2014-07-14 11:34:53

Java 8Nashorn

2010-08-19 09:48:41

Unix

2013-04-09 12:59:21

WindowsPhon

2014-07-15 14:12:17

Java8

2013-05-15 09:31:33

大數(shù)據(jù)GraphLab圖譜分析

2014-03-19 11:04:14

Java 8Java8特性

2014-04-15 15:45:22

Java8Java8教程

2013-03-26 13:48:10

Windows 8

2014-04-10 16:33:48

iOS 7新特性

2014-08-21 10:34:11

Java 9Java

2016-09-09 14:50:34

iOS 10移動(dòng)應(yīng)用特性

2023-12-29 08:54:02

Optional個(gè)性化服務(wù)

2011-05-07 16:08:29

Windows 8

2022-02-14 09:32:49

Go場(chǎng)景TryLock
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)