Atitit. null錯誤的設計 使用Optional來處理null 然後,我們再看看null還會引入什麼問題。 看看下麵這個代碼: String address = person.getCountry().getProvince().getCity(); 如果你玩過一些函數式語言(Haskell ...
Atitit. null錯誤的設計 使用Optional來處理null
然後,我們再看看null還會引入什麼問題。
看看下麵這個代碼:
String address = person.getCountry().getProvince().getCity();
如果你玩過一些函數式語言(Haskell、Erlang、Clojure、Scala等等),上面這樣是一種很自然的寫法。用Java當然也可以實現上面這樣的編寫方式。
但是為了完滿的處理所有可能出現的null異常,我們不得不把這種優雅的函數編程範式改為這樣:
if (person != null) {
Country country = person.getCountry();
if (country != null) {
Province province = country.getProvince();
if (province != null) {
address = province.getCity();
}
}
}
瞬間,高逼格的函數式編程Java8又回到了10年前。這樣一層一層的嵌套判斷,增加代碼量和不優雅還是小事。更可能出現的情況是:在大部分時間里,人們會忘記去判斷這可能會出現的null,即使是寫了多年代碼的老人家也不例外。
作者:: ★(attilax)>>> 綽號:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿爾 拉帕努伊 ) 漢字名:艾龍, EMAIL:[email protected]
轉載請註明來源: http://www.cnblogs.com/attilax/
我們看看前面提到的Person.getCountry().getProvince().getCity()怎麼不用一堆if來處理。
第一種方法是不改變以前的entity:
這裡用Optional作為每一次返回的外殼,如果有某個位置返回了null,則會直接得到"unkonwn"。
第二種辦法是將所有的值都用Optional來定義:
第一種方法可以平滑的和已有的JavaBean、Entity或POJA整合,而無需改動什麼,也能更輕鬆的整合到第三方介面中(例如spring的bean)。建議目前還是以第一種Optional的使用方法為主,畢竟不是團隊中每一個人都能理解每個get/set帶著一個Optional的用意。
Optional還提供了一個filter方法用於過濾數據(實際上Java8里stream風格的介面都提供了filter方法)。例如過去我們判斷值存在並作出相應的處理:
Java函數式開發——優雅的Optional空指針處理 - 隨風溜達的嚮日葵 - 開源中國社區.html