錙銖必較:編寫政治正確的代碼——來聊聊java8的Optional

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方法鞋真。

這樣崇堰,我們就寫出來政治正確的代碼了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涩咖,一起剝皮案震驚了整個(gè)濱河市海诲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌檩互,老刑警劉巖特幔,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異闸昨,居然都是意外死亡蚯斯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門饵较,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拍嵌,“玉大人,你說我怎么就攤上這事循诉『崃荆” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵茄猫,是天一觀的道長狈蚤。 經(jīng)常有香客問我,道長划纽,這世上最難降的妖魔是什么炫惩? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮阿浓,結(jié)果婚禮上他嚷,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好筋蓖,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布卸耘。 她就那樣靜靜地躺著,像睡著了一般粘咖。 火紅的嫁衣襯著肌膚如雪蚣抗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天瓮下,我揣著相機(jī)與錄音翰铡,去河邊找鬼。 笑死讽坏,一個(gè)胖子當(dāng)著我的面吹牛锭魔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播路呜,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼迷捧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了胀葱?” 一聲冷哼從身側(cè)響起漠秋,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抵屿,沒想到半個(gè)月后庆锦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轧葛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年搂抒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朝群。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖中符,靈堂內(nèi)的尸體忽然破棺而出姜胖,到底是詐尸還是另有隱情,我是刑警寧澤淀散,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布右莱,位于F島的核電站,受9級(jí)特大地震影響档插,放射性物質(zhì)發(fā)生泄漏慢蜓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一郭膛、第九天 我趴在偏房一處隱蔽的房頂上張望晨抡。 院中可真熱鬧,春花似錦、人聲如沸耘柱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽调煎。三九已至镜遣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間士袄,已是汗流浹背悲关。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娄柳,地道東北人寓辱。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像西土,于是被迫代替她去往敵國和親讶舰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,926評(píng)論 6 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理需了,服務(wù)發(fā)現(xiàn)跳昼,斷路器,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,763評(píng)論 0 38
  • Optional 本章內(nèi)容 如何為缺失的值建模 Optional 類 應(yīng)用Optional的幾種模式 使用Opti...
    追憶逝水年華閱讀 1,785評(píng)論 0 0
  • 添加水印 在開發(fā)中如果是需要用到很多圖片的:比如微博肋乍,上傳的圖片都會(huì)在右下角添加水印 水印有可能是文字鹅颊,也有可能是...
    Coder007閱讀 229評(píng)論 0 0