Guava-使用&&避免null

在使用null的過程當中的一些問題:

1,null語義表達不清晰。例如Map.get(key)返回Null時,可能表示map中的值是null,也可表示map中沒有key對應的值。Null能夠表示失敗、成功或幾乎任何狀況。html

2,在代碼應用級別,null會致使代碼混亂,疑難問題等。java

鑑於以上一些緣由,Guava工具類對Null值都採用快速失敗操做,除非工具類自己提供了針對Null值的因變措施。此外,Guava還提供了不少工具類,讓你更方便地用特定值替換Null值。git


Optional

大多數狀況下,開發人員使用null代表的是某種缺失情形:多是已經有一個默認值,或沒有值,或找不到值。例如,Map.get返回null就表示找不到給定鍵對應的值。編程

Guava用Optional<T>表示可能爲null的T類型引用。一個Optional實例可能包含非null的引用(咱們稱之爲引用存在),也可能什麼也不包括(稱之爲引用缺失)。從不說包含的是null值,而是用存在或缺失來表示。但Optional從不會包含null值引用。工具

Optional<Integer> possible = Optional.of(5);
possible.isPresent(); // returns true
possible.get(); // returns 5

Optional無心直接模擬其餘編程環境中的」可選」 or 「可能」語義,但它們的確有類似之處。google

Optional最經常使用的一些操做被羅列以下:spa

建立Optional實例(如下都是靜態方法):翻譯

Optional.of(T) 建立指定引用的Optional實例,若引用爲null則快速失敗
Optional.absent() 建立引用缺失的Optional實例
Optional.fromNullable(T) 建立指定引用的Optional實例,若引用爲null則表示缺失

用Optional實例查詢引用(如下都是非靜態方法):code

boolean isPresent() 若是Optional包含非null的引用(引用存在),返回true
T get() 返回Optional所包含的引用,若引用缺失,則拋出java.lang.IllegalStateException
T or(T) 返回Optional所包含的引用,若引用缺失,返回指定的值
T orNull() 返回Optional所包含的引用,若引用缺失,返回null
Set<T> asSet() 返回Optional所包含引用的單例不可變集,若是引用存在,返回一個只有單一元素的集合,若是引用缺失,返回一個空集合。


使用Optional的意義:

使用Optional除了賦予null語義,增長了可讀性,最大的優勢在於它是一種傻瓜式的防禦。Optional迫使你積極思考引用缺失的狀況, 由於你必須顯式地從Optional獲取引用。直接使用null很容易讓人忘掉某些情形。htm


其餘處理null的便利方法:

當你須要用一個默認值來替換可能的null,請使用Objects.firstNonNull(T, T) 方法。若是兩個值都是null,該方法會拋出NullPointerException。Optional也是一個比較好的替代方案,例如:Optional.of(first).or(second).


還有其它一些方法專門處理null或空字符串:

emptyToNull(String)

nullToEmpty(String)

isNullOrEmpty(String)

咱們想要強調的是,這些方法主要用來與混淆null/空的API進行交互。當每次你寫下混淆null/空的代碼時,Guava團隊都淚流滿面。(好的作法是積極地把null和空區分開,以表示不一樣的含義,在代碼中把null和空同等對待是一種使人不安的)。


本文概況性翻譯:https://code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained#Optional

相關文章
相關標籤/搜索