[GoogleGuava]11-使用和避免null-編程開發(fā)技術(shù)_第1頁
[GoogleGuava]11-使用和避免null-編程開發(fā)技術(shù)_第2頁
[GoogleGuava]11-使用和避免null-編程開發(fā)技術(shù)_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、google guava 1.1-使用和避免null -編程 開發(fā)技術(shù)google guava 1. 1-使用和避免 null譯文出處:沈義揚(yáng) 原文出處:原文鏈接?doug lea?說,“null 真糟糕?!?當(dāng)sir c. 4 r. hoarc?使用了null引用后說,”使用它導(dǎo)致了丁億美金的 錯(cuò)誤?!陛p率地使用null可能會(huì)導(dǎo)致很多令人驚愕的問題。通過學(xué)習(xí)google底層代碼庫, 我們發(fā)現(xiàn)95%的集合類不接受null值作為元素。我們認(rèn)為,相比默默地接受 null,使用快速失敗操作拒絕null值對開發(fā)者更有幫助。此外,null的含糊語義讓人很不舒服。null很少可以明確地表示某種語義,例 如

2、,map. get (key)返回null時(shí),可能表示map中的值是null,亦或map中沒有 key對應(yīng)的值。null可以表示失敗、成功或兒乎任何情況。使用null以外的特 定值,會(huì)讓你的邏輯描述變得更清晰。null確實(shí)也有合適和正確的使用場景,如在性能和速度方面null是廉價(jià)的,而 且在對彖數(shù)組屮,出現(xiàn)null也是無法避免的。但相對于底層庫來說,在應(yīng)用級 別的代碼屮,null往往是導(dǎo)致混亂,疑難問題和模糊語義的元兇,就如同我們 舉過的map. get (key)的例了。最關(guān)鍵的是,null木身沒有定義它表達(dá)的意思。鑒于這些原因,很多guava工具類對null值都采用快速失敗操作,除非工具類

3、 本身提供了針對null值的因變措施。此外,guava還提供了很多工具類,讓你 更方便地用特定值替換null值。具體案例不要在set中使用null,或者把null作為map的鍵值。使用特殊值代表null 會(huì)讓查找操作的語義更清晰。如果你想把nul 1作為map中某條0的值,更好的辦法是 不把這一,條0放到map 中,而是單獨(dú)維護(hù)一個(gè)”值為null的鍵集合” (null keys) o map中對應(yīng)某個(gè) 鍵的值是null,和map屮沒冇對應(yīng)某個(gè)鍵的值,是非常容易混淆的兩種情況。 因此,最好把值為null的鍵分離開,并且仔細(xì)想想,null值的鍵在你的項(xiàng)目中 到底表達(dá)了什么語義。如果你需要在列表中使

4、用null并且這個(gè)列表的數(shù)據(jù)是稀疏的,使用 map<intcgcr, e>可能會(huì)更高效,并且更準(zhǔn)確地符合你的潛在需求。此外,考慮一下使用自然的null對象 $殊值。舉例來說,為某個(gè)enum類型 增加特殊的枚舉值表示null,比如java. math. roundingmode就定義了一個(gè)枚舉 值unnecessary,它表示一種不做任何舍入操作的模式,用這種模式做舍入操作 會(huì)直接拋出異常。如果你真的需耍使用null值,但是null値不能和guava中的集合實(shí)現(xiàn)一起工作, 你只能選擇其他實(shí)現(xiàn)。比如,用jdk中的collections, unmodifiablelist替代 guava

5、 的 immutablclistoptional大多數(shù)情況下,開發(fā)人員使用null表明的是某種缺失情形:可能是已經(jīng)有一個(gè) 默認(rèn)值,或沒有值,或找不到值。例如,map. get返冋null就表示找不到給定 鍵對應(yīng)的值。guava用optional<t>表示可能為null的t類型引用。一個(gè)optional實(shí)例可能 包含非null的引用(我們稱z為引用存在),也可能什么也不包括(稱z為引 用缺失)。它從不說包含的是null值,而是用存在或缺失來表示。但optional 從不會(huì)包含null值引用。optional<integer> possible 二 optional. of

6、 (5);possiblc. isprcscnt(); / rcturns truepossible, get () ; / returns 5optional無意直接模擬其他編程環(huán)境屮的”可選” or “可能”語義,但它們 的確有相似之處。optional最常用的一些操作被羅列如下:創(chuàng)建optional實(shí)例(以下都是靜態(tài)方法):optional, of®|創(chuàng)建指定引用的optional實(shí)例,若引用為null則快速失敗optional. absent5創(chuàng)建引用缺失的optional實(shí)例optiona匸i、romul lable(t)創(chuàng)建指定引用的optional實(shí)例,若引用為null

7、則表示缺失用optional實(shí)例查詢引用(以下都是非靜態(tài)方法):boolean ispresent()如杲optional包含非null的引用(引用存在),返回truet get ()返冋optional所包含的引用,若引用缺失,則拋出 java.lang.illegalstateexceptiont or返回optional所包含的引用,若引用缺失,返回指定的值t orxull ()返回optional所包含的引用,若引用缺失,返回nullset<t> asset ()返冋optional所包含引用的單例不可變集,如果引用存在,返 回一個(gè)只有單一元素的集合,如果引用缺失,返回一個(gè)

8、空集合。使用optional的意義在哪兒?使用optional除了賦予null語義,增加了可讀性,最大的優(yōu)點(diǎn)在于它是一種傻 瓜式的防護(hù)。optional迫使你積極思考引用缺失的情況,因?yàn)槟惚仨氾@式地從 optional獲取引用。直接使用null很容易讓人忘掉某些情形,盡管findbugs 可以幫助查找null相關(guān)的問題,但是我們還是認(rèn)為它并不能準(zhǔn)確地定位問題根 源。如同輸入?yún)?shù),方法的返回值也可能是nullo和其他人一樣,你絕對很可能會(huì) 忘記別人寫的方法method (a, b)會(huì)返冋一個(gè)null,就好像當(dāng)你實(shí)現(xiàn)method (a, b) 時(shí),也很可能忘記輸入?yún)?shù)a可以為null。將方法的返冋類型指定為optional, 也可以迫使調(diào)用者思考返回的引用缺失的情形。其他處理null的便利方法當(dāng)你需要用一個(gè)默認(rèn)值來替換可能的null,請使用objects. firstnonnull (t, t)? 方法。如果兩個(gè)值都是null,該方法會(huì)拋nullpointerexceptiono optional 也是一個(gè)比較好的替代方案,例如:optional, of (first). or (second).還有其它一些方法專門處理nul 1或空字符串:emptytonul 1 (string), nulltoempty (string), isnulloremp

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論