Guava 作爲Google 開發的開源JAVA庫之後所以能那麼流行,我認爲有幾點原因
可以給開發者提供JDK之外的便利功能,使開發者能夠方便的使用一些原先需要自己手寫的Utility功能
可以強制(對就是強制)開發者摒棄一些不好的編程習慣,雖然這些習慣可能是JAVA本身的語言缺陷造成的
使開發者改進自己的程序模式和架構。這一點可以在 Guava 的 例如 EventBus,Filter, Ordering 等功能加以體現。
從今天開始我將對自己學習的Guava 知識進行梳理和總結。
Optional
我曾經記得一片文檔總結程序設計的10十大天生缺陷, Null 的出現是其中之一。 Google 官方認爲 Null 是是出行混亂和未知bug的最主要的來源, 而且null 非常容易造成模棱兩可的情況,例如當一個Map的get方法返回null 的時候,你完全不知道是Map中沒有這個key值,還是有key值,但是這個key值對應的value是空。 爲了應付這個情況, Google 推薦程序中使用Optional最爲NULL的替代品。
下面看Optional 的一個簡單的使用例子:
Optional<Integer> possible = Optional.of(5);
possible.isPresent(); // returns true
possible.get(); // returns 5
Optional的主旨是用一個非NULL的Object去代替Null的使用,然後用isPresent方法是判斷這個Object所帶變的對象是否爲空。
如何構造Optional
Optional.of(T) 制定一個非空的值傳於of方法,如果傳入的值是空,馬上報錯
Optional.absent() 返回一個代表空對象的Optional
Optiona.fromNullable(T) 傳入的對象可以是NULL或者是非NULL的,通過isPresent來判斷代表對象是否爲空 。
Optional的常用方法
isPresent() 上面提到了很多次, 這裏就不多說了
T get() 返回代理對象,注意如果返回值是空的話,就是報IllegalStateException的錯誤
T or(T) 返回代理對象,但是如果代理對象爲空的情況就用參數的值代替返回
T orNull() 返回代理對象,但是如果代理對象爲空的情況就用NULL 代替返回
Set<T> asSet() 返回一個只有代理對象的不可變單例的Set (使用Collections.singleton 創建的),但是代理對象爲空的話就返回空Set(使用 Collections.emptySet() 創建的)
看到這裏你可能覺得好像Optional也沒有那麼神奇,好像就是一個簡單的包裝然後讀起來稍微方便一點而已, 但是其實就是一個這樣的簡單的改變就能使強制使你思考如果代理對象爲空的時候你應該如何處理。 舉個例子 我們有個底層方法: T get(). 上層使用者可能直接用 T.xxx()的方法而可能造成NullPointerException。 但是如果我們把方法重構爲 Optional<T> get(), 那麼上層使用者就傾向於會主動的去判斷 !isPresent()的情況了。
其他的選擇
當然你可能覺得修改現有接口會有很大的改動和風險, 那麼Guava還提供了一些便利方法供我們使用
Objects.firstNonNull(T,T) 返回第一個不是NULL的對象
Strings.emptyToNull(String) 把空字符串變爲NULL
Strings.NullToEmpty(String) 把NULL變爲空字符串
Strings.isNullOrEmpty(String) 這個方法不太好,因爲如果你傳只有空格的字符串返回是false