AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

別再用 “! = null” 做判空了!

來(lái)源: 責(zé)編: 時(shí)間:2023-09-18 21:41:59 255觀看
導(dǎo)讀問(wèn)題為了避免空指針調(diào)用,我們經(jīng)常會(huì)看到這樣的語(yǔ)句:...if (someobject != null) { someobject.doCalc();}...最終,項(xiàng)目中會(huì)存在大量判空代碼,丑陋繁雜。。。如何避免這種情況?是否濫用了判空?精華回答這是初、中級(jí)程序猿

問(wèn)題

為了避免空指針調(diào)用,我們經(jīng)常會(huì)看到這樣的語(yǔ)句:4eY28資訊網(wǎng)——每日最新資訊28at.com

...if (someobject != null) {    someobject.doCalc();}...

4eY28資訊網(wǎng)——每日最新資訊28at.com

最終,項(xiàng)目中會(huì)存在大量判空代碼,丑陋繁雜。。。如何避免這種情況?是否濫用了判空?4eY28資訊網(wǎng)——每日最新資訊28at.com

4eY28資訊網(wǎng)——每日最新資訊28at.com

4eY28資訊網(wǎng)——每日最新資訊28at.com

精華回答

4eY28資訊網(wǎng)——每日最新資訊28at.com

這是初、中級(jí)程序猿經(jīng)常會(huì)遇到的問(wèn)題。他們總喜歡在方法中返回null,因此,在調(diào)用這些方法時(shí),也不得不去判空。另外,也許受此習(xí)慣影響,他們總潛意識(shí)地認(rèn)為,所有的返回都是不可信任的,為了保護(hù)自己程序,就加了大量的判空。4eY28資訊網(wǎng)——每日最新資訊28at.com

4eY28資訊網(wǎng)——每日最新資訊28at.com

吐槽完畢,回到這個(gè)題目本身:4eY28資訊網(wǎng)——每日最新資訊28at.com

4eY28資訊網(wǎng)——每日最新資訊28at.com

進(jìn)行判空前,請(qǐng)區(qū)分以下兩種情況:4eY28資訊網(wǎng)——每日最新資訊28at.com

4eY28資訊網(wǎng)——每日最新資訊28at.com

  1. null 是一個(gè)有效有意義的返回值(Where null is a valid response in terms of the contract; and)
  2. null是無(wú)效有誤的(Where it isn't a valid response.)

4eY28資訊網(wǎng)——每日最新資訊28at.com

你可能還不明白這兩句話的意思,不急,繼續(xù)往下看,接下來(lái)將詳細(xì)討論這兩種情況4eY28資訊網(wǎng)——每日最新資訊28at.com

4eY28資訊網(wǎng)——每日最新資訊28at.com

先說(shuō)第2種情況

4eY28資訊網(wǎng)——每日最新資訊28at.com

null就是一個(gè)不合理的參數(shù),就應(yīng)該明確地中斷程序,往外拋錯(cuò)誤。這種情況常見于api方法。例如你開發(fā)了一個(gè)接口,id是一個(gè)必選的參數(shù),如果調(diào)用方?jīng)]傳這個(gè)參數(shù)給你,當(dāng)然不行。你要感知到這個(gè)情況,告訴調(diào)用方“嘿,哥們,你傳個(gè)null給我做甚"。4eY28資訊網(wǎng)——每日最新資訊28at.com

4eY28資訊網(wǎng)——每日最新資訊28at.com

相對(duì)于判空語(yǔ)句,更好的檢查方式有兩個(gè):4eY28資訊網(wǎng)——每日最新資訊28at.com

4eY28資訊網(wǎng)——每日最新資訊28at.com

  • assert語(yǔ)句,你可以把錯(cuò)誤原因放到assert的參數(shù)中,這樣不僅能保護(hù)你的程序不往下走,而且還能把錯(cuò)誤原因返回給調(diào)用方,豈不是一舉兩得。(原文介紹了assert的使用,這里省略)
  • 也可以直接拋出空指針異常。上面說(shuō)了,此時(shí)null是個(gè)不合理的參數(shù),有問(wèn)題就是有問(wèn)題,就應(yīng)該大大方方往外拋。

4eY28資訊網(wǎng)——每日最新資訊28at.com

第1種情況會(huì)更復(fù)雜一些。4eY28資訊網(wǎng)——每日最新資訊28at.com

4eY28資訊網(wǎng)——每日最新資訊28at.com

這種情況下,null是個(gè)”看上去“合理的值,例如,我查詢數(shù)據(jù)庫(kù),某個(gè)查詢條件下,就是沒有對(duì)應(yīng)值,此時(shí)null算是表達(dá)了“空”的概念。4eY28資訊網(wǎng)——每日最新資訊28at.com

4eY28資訊網(wǎng)——每日最新資訊28at.com

這里給一些實(shí)踐建議:

4eY28資訊網(wǎng)——每日最新資訊28at.com

假如方法的返回類型是collections,當(dāng)返回結(jié)果是空時(shí),你可以返回一個(gè)空的collections(empty list),而不要返回null,這樣調(diào)用側(cè)就能大膽地處理這個(gè)返回,例如調(diào)用側(cè)拿到返回后,可以直接print list.size(),又無(wú)需擔(dān)心空指針問(wèn)題。(什么?想調(diào)用這個(gè)方法時(shí),不記得之前實(shí)現(xiàn)該方法有沒按照這個(gè)原則?所以說(shuō),代碼習(xí)慣很重要!如果你養(yǎng)成習(xí)慣,都是這樣寫代碼(返回空collections而不返回null),你調(diào)用自己寫的方法時(shí),就能大膽地忽略判空)4eY28資訊網(wǎng)——每日最新資訊28at.com

4eY28資訊網(wǎng)——每日最新資訊28at.com

返回類型不是collections,又怎么辦呢?4eY28資訊網(wǎng)——每日最新資訊28at.com

4eY28資訊網(wǎng)——每日最新資訊28at.com

那就返回一個(gè)空對(duì)象(而非null對(duì)象),下面舉個(gè)“栗子”,假設(shè)有如下代碼:4eY28資訊網(wǎng)——每日最新資訊28at.com

public interface Action {  void doSomething();} public interface Parser {  Action findAction(String userInput);}

4eY28資訊網(wǎng)——每日最新資訊28at.com

其中,Parse有一個(gè)接口FindAction,這個(gè)接口會(huì)依據(jù)用戶的輸入,找到并執(zhí)行對(duì)應(yīng)的動(dòng)作。假如用戶輸入不對(duì),可能就找不到對(duì)應(yīng)的動(dòng)作(Action),因此findAction就會(huì)返回null,接下來(lái)action調(diào)用doSomething方法時(shí),就會(huì)出現(xiàn)空指針。4eY28資訊網(wǎng)——每日最新資訊28at.com

4eY28資訊網(wǎng)——每日最新資訊28at.com

解決這個(gè)問(wèn)題的一個(gè)方式,就是使用Null Object pattern(空對(duì)象模式)。4eY28資訊網(wǎng)——每日最新資訊28at.com

4eY28資訊網(wǎng)——每日最新資訊28at.com

改造后

4eY28資訊網(wǎng)——每日最新資訊28at.com

類定義如下,這樣定義findAction方法后,確保無(wú)論用戶輸入什么,都不會(huì)返回null對(duì)象:4eY28資訊網(wǎng)——每日最新資訊28at.com

public class MyParser implements Parser {  private static Action DO_NOTHING = new Action() {    public void doSomething() { /* do nothing */ }  };   public Action findAction(String userInput) {    // ...    if ( /* we can't find any actions */ ) {      return DO_NOTHING;    }  }}

4eY28資訊網(wǎng)——每日最新資訊28at.com

對(duì)比下面兩份調(diào)用實(shí)例:4eY28資訊網(wǎng)——每日最新資訊28at.com

4eY28資訊網(wǎng)——每日最新資訊28at.com

  • 冗余:每獲取一個(gè)對(duì)象,就判一次空
Parser parser = ParserFactory.getParser();if (parser == null) {  // now what?  // this would be an example of where null isn't (or shouldn't be) a valid response}Action action = parser.findAction(someInput);if (action == null) {  // do nothing} else {
  • 精簡(jiǎn)
ParserFactory.getParser().findAction(someInput).doSomething();

無(wú)論什么情況,都不會(huì)返回空對(duì)象,因此通過(guò)findAction拿到action后,可以放心地調(diào)用action的方法。4eY28資訊網(wǎng)——每日最新資訊28at.com

4eY28資訊網(wǎng)——每日最新資訊28at.com

其他回答精選:

4eY28資訊網(wǎng)——每日最新資訊28at.com

(1) 如果要用equal方法,請(qǐng)用object<不可能為空>.equal(object<可能為空>)),例如使用:4eY28資訊網(wǎng)——每日最新資訊28at.com

"bar".equals(foo)

而不是:4eY28資訊網(wǎng)——每日最新資訊28at.com

foo.equals("bar")

4eY28資訊網(wǎng)——每日最新資訊28at.com

(2) Java8或者guava lib中,提供了Optional類,這是一個(gè)元素容器,通過(guò)它來(lái)封裝對(duì)象,可以減少判空。不過(guò)代碼量還是不少。不爽。4eY28資訊網(wǎng)——每日最新資訊28at.com

4eY28資訊網(wǎng)——每日最新資訊28at.com

(3) 如果你想返回null,請(qǐng)停下來(lái)想一想,這個(gè)地方是否更應(yīng)該拋出一個(gè)異常。4eY28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-10476-0.html別再用 “! = null” 做判空了!

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 優(yōu)化自動(dòng)化接口測(cè)試:利用鉤子函數(shù)增強(qiáng)HTTP請(qǐng)求處理

下一篇: HashMap 的基礎(chǔ)結(jié)構(gòu),必須掌握!

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 直屏旗艦來(lái)了 iQOO 12和K70 Pro同臺(tái)競(jìng)技

    旗艦機(jī)基本上使用的都是雙曲面屏幕,這就讓很多喜歡直屏的愛好者在苦等一款直屏旗艦,這次,你們等到了。據(jù)博主數(shù)碼閑聊站帶來(lái)的最新爆料稱,Redmi下代旗艦K70 Pro和iQOO 12兩款手
  • 6月iOS設(shè)備好評(píng)榜:第一蟬聯(lián)榜首近一年

    作為安兔兔各種榜單里變化最小的那個(gè),2023年6月的iOS好評(píng)榜和上個(gè)月相比沒有任何排名上的變化,僅僅是部分設(shè)備好評(píng)率的下降,長(zhǎng)年累月的用戶評(píng)價(jià)和逐漸退出市場(chǎng)的老款機(jī)器讓這
  • 從 Pulsar Client 的原理到它的監(jiān)控面板

    背景前段時(shí)間業(yè)務(wù)團(tuán)隊(duì)偶爾會(huì)碰到一些 Pulsar 使用的問(wèn)題,比如消息阻塞不消費(fèi)了、生產(chǎn)者消息發(fā)送緩慢等各種問(wèn)題。雖然我們有個(gè)監(jiān)控頁(yè)面可以根據(jù) topic 維度查看他的發(fā)送狀態(tài),
  • 三言兩語(yǔ)說(shuō)透設(shè)計(jì)模式的藝術(shù)-單例模式

    寫在前面單例模式是一種常用的軟件設(shè)計(jì)模式,它所創(chuàng)建的對(duì)象只有一個(gè)實(shí)例,且該實(shí)例易于被外界訪問(wèn)。單例對(duì)象由于只有一個(gè)實(shí)例,所以它可以方便地被系統(tǒng)中的其他對(duì)象共享,從而減少
  • 得物寵物生意「狂飆」,發(fā)力“它經(jīng)濟(jì)”

    作者|花花小萌主近日,得物宣布正式上線寵物鑒別,通過(guò)得物App內(nèi)的&ldquo;在線鑒別&rdquo;,可找到鑒別寵物的選項(xiàng)。通過(guò)上傳自家寵物的部位細(xì)節(jié),就能收獲擁有專業(yè)資質(zhì)認(rèn)證的得物鑒
  • 大廠卷向扁平化

    來(lái)源:新熵作者丨南枝 編輯丨月見大廠職級(jí)不香了。俗話說(shuō),兵無(wú)常勢(shì),水無(wú)常形,互聯(lián)網(wǎng)企業(yè)調(diào)整職級(jí)體系并不稀奇。7月13日,淘寶天貓集團(tuán)啟動(dòng)了近年來(lái)最大的人力制度改革,目前已形成一
  • ESG的面子與里子

    來(lái)源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預(yù)警不絕,但處于厄爾尼諾大&ldquo;烤&rdquo;之下的除了眾生,還有各大企業(yè)發(fā)布的ESG報(bào)告。ESG是&ldquo;環(huán)境保
  • 半導(dǎo)體需求下滑 三星電子DS業(yè)務(wù)部門今年?duì)I業(yè)虧損預(yù)計(jì)超10萬(wàn)億韓元

    7月17日消息,據(jù)外媒報(bào)道,去年下半年開始的半導(dǎo)體需求下滑,影響到了三星電子、SK海力士、英特爾等諸多廠商,營(yíng)收明顯下滑,部分廠商甚至出現(xiàn)了虧損。作為
  • iQOO Neo8 Pro真機(jī)諜照曝光:天璣9200+和V1+旗艦雙芯加持

    去年10月,iQOO推出了iQOO Neo7系列機(jī)型,不僅搭載了天璣9000+,而且是同價(jià)位唯一一款天璣9000+直屏旗艦,一經(jīng)上市便受到了用戶的廣泛關(guān)注。在時(shí)隔半年后,
Top