掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
在Java中,如果你嘗試對null做函數(shù)調(diào)用,就會引發(fā)NullPointerException(NPE),NPE是Java程序開發(fā)中的典型的異常,對于Java開發(fā)者來說,無論你是初出茅廬的新人和還工作多年的老司機,NPE經(jīng)常讓他們翻車。為了避免NPE,他們會加很多if判斷語句,使得代碼的可讀性變得很差。

從軟件設計的角度來看,null本身是沒有意義的語義,這是一種對缺失變量值的錯誤的建模。
從Java類型系統(tǒng)的角度看,null可以被賦值給任何類型的變量,并且不斷被傳遞,知道***誰也不知道它是從哪里引入的。
Optional的引入
Java設計者從Haskell和Scala中獲取靈感,在Java 8中引入了一個新的類 java.util.Optional
Optional的目的就在于此:通過類型系統(tǒng)讓你的領(lǐng)域模型中隱藏的知識顯式地體現(xiàn)在你的代碼中。
Optional的使用
上面這張表里列舉了Optional的基礎API,我這里列舉了一些使用的tips:
使用工具類方法改良可能拋出異常的API
Java方法處理異常結(jié)果的方式有兩種:返回null(或錯誤碼);拋出異常,例如:Integer.parseInt(String)這個方法——如果無法解析到對應的整型,該方法就拋出一個NumberFormationException,這種情況下我們一般會使用try/catch語句處理異常情況。
一般我們建議將try/catch塊單獨提取到一個方法中,在這里使用Optional設計這個方法,代碼如下。在開發(fā)中,可以嘗試構(gòu)建一個OptionalUtility工具類,將這些復雜的try/catch邏輯封裝起來。
現(xiàn)在有個方法,是嘗試從一個屬性映射中獲取某個關(guān)鍵詞對應的值,例子代碼如下:
使用Optional的寫法后,代碼如下所示:
如果需要訪問的屬性值不存在,Properites.getProperty(String)方法的返回值就是一個null,使用noNullable工廠方法就可以將該值轉(zhuǎn)換為Optional對象;接下來,可以使用flatMap將一個Optional
使用Optional的思路和Stream相同,都是鏈式思路,跟數(shù)據(jù)庫查詢似的,表達力很強,而且省去了哪些復雜的try/catch和if-then-else方法。在后面的開發(fā)中,可以使用Optional設計API,這樣可以設計出更安全的接口和方法。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流