java8的Optional到底有什么用呢?說起來件豌,它比原來的null值判斷有什么優(yōu)勢呢?
它實(shí)際上可以看做一個(gè)容器,容器里可能有一個(gè)非null的值控嗜,也可能沒有苟径。它帶來最大的好處,就是代碼在語義上政治正確躬审。代碼好用不好用不要緊棘街,政治一定要正確。
比如我們有個(gè)Integer類型的列表類FooList遭殉,它有兩個(gè)方法,一個(gè)返回列表的長度博助,一個(gè)返回比傳入?yún)?shù)小的险污,最大的那個(gè)值。
在沒有Optional的時(shí)候,代碼如下
public class FooList {
public Integer size() {
throw new UnsupportedOperationException();
}
public Integer maxNumberBelow(Integer upperBound) {
throw new UnsupportedOperationException();
}
}
語義上的問題在于蛔糯,size方法一定會(huì)返回一個(gè)數(shù)字拯腮,maxNumberBelow則不會(huì)。如果列表是空的蚁飒,size返回0动壤,maxNumberBelow(100)該返回什么呢?
這時(shí)大家就八仙過海淮逻,各顯神通了琼懊。
1 直接返回null。比較常用的一個(gè)方法爬早。
2 返回一個(gè)不合法的值哼丈。比如String里的indexOf方法,會(huì)返回一個(gè)-1筛严。
3 拋一個(gè)異常醉旦。比如jpa里的EntityNotFoundException。
順便說一句桨啃,我覺得拋異常是最不可取的形式髓抑,首先不討論是否應(yīng)該是受檢異常,數(shù)據(jù)庫里沒有記錄就拋異常好像也不符合異常的定義优幸。數(shù)據(jù)庫里查不到數(shù)據(jù)挺正常的,怎么會(huì)是異常呢褪猛?政治不正確啊网杆。
開發(fā)者八仙過海之后,使用者就目瞪口呆了伊滋。為什么呢碳却?因?yàn)椴还芩麄冊(cè)趺窗讼蛇^海,方法的語義上都很難看出來開發(fā)者用的哪種神通——方法簽名沒辦法有效的標(biāo)識(shí)出它是不是每次都能返回合理的值笑旺,也沒法標(biāo)識(shí)出它無法返回合理的值時(shí)的行為昼浦。無法返回合理的值是什么表現(xiàn)?返回了null筒主?返回了一個(gè)特殊的值关噪?還是throw了異常?在IDE里調(diào)用方法的時(shí)候根本看不出來乌妙,只能看文檔J雇谩!藤韵!
讓開發(fā)者好好寫文檔虐沥?不存在的!
讓開發(fā)者認(rèn)真看文檔?不存在的欲险!
為啥size返回的Integer可以肆無忌憚的使用镐依,而maxNumberBelow返回的Integer就必須和一個(gè)奇奇怪怪的值做比較?種族歧視天试?
讓開發(fā)者分清楚這些槐壳?不存在的!
所以用大家都趕緊用Optional吧秋秤,上面所有問題迎刃而解宏粤!
public class BarList {
public Integer size() {
throw new UnsupportedOperationException();
}
public Optional<Integer> maxNumberBelow(Integer upperBound) {
throw new UnsupportedOperationException();
}
}
首先,返回值就能明確區(qū)分出灼卢,方法是每次返回合理的值還是有條件的返回合理的值绍哎。
其次,IDE還能檢查出來對(duì)Optional對(duì)象跳過isPresent直接調(diào)用get方法鞋真。
這樣崇堰,我們就寫出來政治正確的代碼了。