精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

談?wù)勗贘ava中如何優(yōu)雅地判空 !

開發(fā) 后端
作為搬磚黨的一族們,我們對判空一定再熟悉不過了,不要跟我說你很少進行判空,除非你喜歡NullPointerException。

 判空災(zāi)難

作為搬磚黨的一族們,我們對判空一定再熟悉不過了,不要跟我說你很少進行判空,除非你喜歡NullPointerException。

不過NullPointerException對于很多猿們來說,也是Exception家族中最親近的一員了。

[[343874]]

為了避免NullPointerException來找我們,我們經(jīng)常會進行如下操作。 

  1. if (data != null) {  
  2.     do sth.  

如果一個類中多次使用某個對象,那你可能要一頓操作,so:

“世界第九大奇跡”就這樣誕生了。Maybe你會想,項目中肯定不止你一個人會這樣一頓操作,然后按下Command+Shift+F,真相就在眼前:

What,我們有接近一萬行的代碼都是在判空?

好了,接下來,要進入正題了。

NullObject模式

對于項目中無數(shù)次的判空,對代碼質(zhì)量整潔度產(chǎn)生了十分之惡劣的影響,對于這種現(xiàn)象,我們稱之為“判空災(zāi)難”。

那么,這種現(xiàn)象如何治理呢,你可能聽說過NullObject模式,不過這不是我們今天的武器,但是還是需要介紹一下NullObject模式。

什么是NullObject模式呢?

In object-oriented computer programming, a null object is an object with no referenced value or with defined neutral ("null") behavior. The null object design pattern describes the uses of such objects and their behavior (or lack thereof).

以上解析來自Wikipedia。

NullObject模式首次發(fā)表在“ 程序設(shè)計模式語言 ”系列叢書中。一般的,在面向?qū)ο笳Z言中,對對象的調(diào)用前需要使用判空檢查,來判斷這些對象是否為空,因為在空引用上無法調(diào)用所需方法。

空對象模式的一種典型實現(xiàn)方式如下圖所示(圖片來自網(wǎng)絡(luò)):

示例代碼如下(命名來自網(wǎng)絡(luò),哈哈到底是有多懶):

Nullable是空對象的相關(guān)操作接口,用于確定對象是否為空,因為在空對象模式中,對象為空會被包裝成一個Object,成為Null Object,該對象會對原有對象的所有方法進行空實現(xiàn)… 

  1. public interface Nullable {  
  2.     boolean isNull();  

這個接口定義了業(yè)務(wù)對象的行為。 

  1. public interface DependencyBase extends Nullable {  
  2.     void Operation();  

這是該對象的真實類,實現(xiàn)了業(yè)務(wù)行為接口DependencyBase與空對象操作接口Nullable。 

  1. public class Dependency implements DependencyBase, Nullable {  
  2.     @Override  
  3.     public void Operation() {  
  4.         System.out.print("Test!");  
  5.     }  
  6.     @Override  
  7.     public boolean isNull() {  
  8.         return false;  
  9.     }  

這是空對象,對原有對象的行為進行了空實現(xiàn)。 

  1. public class NullObject implements DependencyBase{  
  2.     @Override  
  3.     public void Operation() {  
  4.         // do nothing  
  5.     }  
  6.     @Override  
  7.     public boolean isNull() {  
  8.         return true;  
  9.     }  

在使用時,可以通過工廠調(diào)用方式來進行空對象的調(diào)用,也可以通過其他如反射的方式對對象進行調(diào)用(一般多耗時幾毫秒)在此不進行詳細敘述。 

  1. public class Factory {  
  2.     public static DependencyBase get(Nullable dependencyBase){  
  3.         if (dependencyBase == null){  
  4.             return new NullObject(); 
  5.          }  
  6.         return new Dependency();  
  7.     } 
  8.  

這是一個使用范例,通過這種模式,我們不再需要進行對象的判空操作,而是可以直接使用對象,也不必擔(dān)心NPE(NullPointerException)的問題。 

  1. public class Client {  
  2.     public void test(DependencyBase dependencyBase){  
  3.         Factory.get(dependencyBase).Operation(); 
  4.     }  

關(guān)于空對象模式,更具體的內(nèi)容大家也可以多找一找資料,上述只是對NullObject的簡單介紹,但是,今天我要推薦的是一款協(xié)助判空的插件NR Null Object,讓我們來優(yōu)雅地進行判空,不再進行一頓操作來定義繁瑣的空對象接口與空獨享實現(xiàn)類。

.NR Null Object

NR Null Object是一款適用于Android Studio、IntelliJ IDEA、PhpStorm、WebStorm、PyCharm、RubyMine、AppCode、CLion、GoLand、DataGrip等IDEA的Intellij插件。其可以根據(jù)現(xiàn)有對象,便捷快速生成其空對象模式需要的組成成分,其包含功能如下:

  1.  分析所選類可聲明為接口的方法;
  2.  抽象出公有接口;
  3.  創(chuàng)建空對象,自動實現(xiàn)公有接口;
  4.  對部分函數(shù)進行可為空聲明;
  5.  可追加函數(shù)進行再次生成;
  6.  自動的函數(shù)命名規(guī)范

讓我們來看一個使用范例:

怎么樣,看起來是不是非常快速便捷,只需要在原有需要進行多次判空的對象中,郵件彈出菜單,選擇Generate,并選擇NR Null Object即可自動生成相應(yīng)的空對象組件。

那么如何來獲得這款插件呢?

安裝方式

可以直接通過IDEA的Preferences中的Plugins倉庫進行安裝。

選擇 Preferences → Plugins → Browse repositories   

搜索“NR Null Oject”或者“Null Oject”進行模糊查詢,點擊右側(cè)的Install,restart IDEA即可。

Optional

還有一種方式是使用Java8特性中的Optional來進行優(yōu)雅地判空,Optional來自官方的介紹如下:

A container object which may or may not contain a non-null value. If a value is present, isPresent() will return true and get() will return the value.

一個可能包含也可能不包含非null值的容器對象。如果存在值,isPresent()將返回true,get()將返回該值。

話不多說,舉個例子。

[[343876]]

有如下代碼,需要獲得Test2中的Info信息,但是參數(shù)為Test4,我們要一層層的申請,每一層都獲得的對象都可能是空,最后的代碼看起來就像這樣。 

  1. public String testSimple(Test4 test) { 
  2.        if (test == null) {  
  3.           return "";  
  4.       }  
  5.       if (test.getTest3() == null) {  
  6.           return "";  
  7.       }  
  8.       if (test.getTest3().getTest2() == null) {  
  9.           return "";  
  10.       }  
  11.       if (test.getTest3().getTest2().getInfo() == null) {  
  12.           return "";  
  13.       }  
  14.       return test.getTest3().getTest2().getInfo(); 
  15.    } 

但是使用Optional后,整個就都不一樣了。   

  1. public String testOptional(Test test) {  
  2.        return Optional.ofNullable(test).flatMap(Test::getTest3)  
  3.                .flatMap(Test3::getTest2)  
  4.                .map(Test2::getInfo)  
  5.                .orElse("");  
  6.    } 

1、Optional.ofNullable(test),如果test為空,則返回一個單例空Optional對象,如果非空則返回一個Optional包裝對象,Optional將test包裝; 

  1. public static <T> Optional<T> ofNullable(T value) {  
  2.      return value == null ? empty() : of(value);  
  3.  } 

2、flatMap(Test::getTest3)判斷test是否為空,如果為空,繼續(xù)返回第一步中的單例Optional對象,否則調(diào)用Test的getTest3方法; 

  1. public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {  
  2.       Objects.requireNonNull(mapper);  
  3.       if (!isPresent())  
  4.           return empty();  
  5.       else {  
  6.           return Objects.requireNonNull(mapper.apply(value));  
  7.       }  
  8.   } 

3、flatMap(Test3::getTest2)同上調(diào)用Test3的getTest2方法;

4、map(Test2::getInfo)同flatMap類似,但是flatMap要求Test3::getTest2返回值為Optional類型,而map不需要,flatMap不會多層包裝,map返回會再次包裝Optional; 

  1. public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {  
  2.      Objects.requireNonNull(mapper);  
  3.      if (!isPresent()) 
  4.           return empty();  
  5.      else {  
  6.          return Optional.ofNullable(mapper.apply(value));  
  7.      }  
  8.  } 

5、orElse("");獲得map中的value,不為空則直接返回value,為空則返回傳入的參數(shù)作為默認值。 

  1. public T orElse(T other) {  
  2.     return value != null ? value : other;  

怎么樣,使用Optional后我們的代碼是不是瞬間變得非常整潔,或許看到這段代碼你會有很多疑問,針對復(fù)雜的一長串判空,Optional有它的優(yōu)勢,但是對于簡單的判空使用Optional也會增加代碼的閱讀成本、編碼量以及團隊新成員的學(xué)習(xí)成本。畢竟Optional在現(xiàn)在還并沒有像RxJava那樣流行,它還擁有一定的局限性。

如果直接使用Java8中的Optional,需要保證安卓API級別在24及以上。

你也可以直接引入Google的Guava。(啥是Guava?來自官方的提示)

Guava is a set of core libraries that includes new collection types (such as multimap and multiset), immutable collections, a graph library, functional types, an in-memory cache, and APIs/utilities for concurrency, I/O, hashing, primitives, reflection, string processing, and much more!

引用方式,就像這樣:   

  1. dependencies {  
  2.      compile 'com.google.guava:guava:27.0-jre'  
  3.      // or, for Android:  
  4.      api 'com.google.guava:guava:27.0-android'  
  5.    } 

不過IDEA默認會顯示黃色,提示讓你將Guava表達式遷移到Java Api上。

當然,你也可以通過在Preferences搜索"Guava"來Kill掉這個Yellow的提示。

關(guān)于Optional使用還有很多技巧,感興趣可以查閱Guava和Java8相關(guān)書籍和文檔。

使用Optional具有如下優(yōu)點:

  •  將防御式編程代碼完美包裝
  •  鏈式調(diào)用
  •  有效避免程序代碼中的空指針

但是也同樣具有一些缺點:

  1.  流行性不是非常理想,團隊新成員需要學(xué)習(xí)成本
  2.  安卓中需要引入Guava,需要團隊每個人處理IDEA默認提示,或者忍受黃色提示

有時候代碼閱讀看起來可能會如下圖所示:

[[343877]]

Kotlin

當然,Kotlin以具有優(yōu)秀的空安全性為一大特色,并可以與Java很好的混合使用,like this:

  1. test1?.test2?.test3?.test4 

如果你已經(jīng)開始使用了Kotlin,可以不用再寫繚亂的防御判空語句。如果你還沒有使用Kotlin,并不推薦為了判空優(yōu)雅而直接轉(zhuǎn)向Kotlin。 

 

責(zé)任編輯:龐桂玉 來源: java版web項目
相關(guān)推薦

2020-04-10 10:22:12

Java判空編程語言

2017-04-12 11:16:08

Python終端編程

2023-05-12 14:14:00

Java線程中斷

2021-03-24 10:20:50

Fonts前端代碼

2021-04-15 00:16:18

JavaString字符串

2024-10-15 15:58:11

2020-12-08 08:08:51

Java接口數(shù)據(jù)

2024-11-13 16:37:00

Java線程池

2024-07-10 19:06:09

2020-04-03 13:45:16

刪除Linux垃圾文件

2020-02-24 11:12:01

Linux電腦數(shù)據(jù)

2023-12-20 13:50:00

SpringBootJSON序列化

2024-11-21 09:00:00

Python字典代碼

2020-02-05 14:05:21

Java技術(shù)數(shù)組

2021-05-12 22:07:43

并發(fā)編排任務(wù)

2022-05-13 21:20:23

組件庫樣式選擇器

2021-01-18 13:17:04

鴻蒙HarmonyOSAPP

2020-03-26 11:04:00

Linux命令光標

2024-04-24 12:34:08

Spring事務(wù)編程

2021-01-28 14:53:19

PHP編碼開發(fā)
點贊
收藏

51CTO技術(shù)棧公眾號

亚洲片区在线| 巨大黑人极品videos精品| 97se狠狠狠综合亚洲狠狠| 欧美亚洲免费电影| 18禁裸乳无遮挡啪啪无码免费| 最新欧美电影| 中文字幕色av一区二区三区| 国产精品国产精品国产专区蜜臀ah | 国产91在线精品| 国产精品超碰97尤物18| 波多野结衣成人在线| 无码人妻精品一区二区三区9厂 | 在线精品国产成人综合| 亚欧美一区二区三区| 色戒汤唯在线观看| 1区2区3区国产精品| 久久久久久高清| 亚洲综合视频在线播放| 在线日韩中文| 精品国产一区二区三区四区在线观看 | 伊人中文字幕在线观看| 小小影院久久| 亚洲欧美制服第一页| 亚洲av无码久久精品色欲| 456亚洲精品成人影院| 亚洲一区二区三区视频在线播放 | av黄色在线| 久久久91精品国产一区二区精品 | 亚洲精品国产一区二区精华液| 美女主播视频一区| 丰满人妻一区二区三区无码av| 秋霞成人午夜伦在线观看| 97免费在线视频| xxxx日本少妇| 午夜欧美在线| 日韩一级裸体免费视频| 国内精品卡一卡二卡三| 亚洲都市激情| 亚洲国产精品久久久久| 欧美日韩久久婷婷| 日本成人在线网站| 在线观看日韩精品| 黄色一级一级片| 中文字幕这里只有精品| 偷拍日韩校园综合在线| 日本香蕉视频在线观看| 在线观看a级片| 亚洲视频网在线直播| 亚洲三级一区| 日本激情在线观看| 国产精品美女久久久久久久久久久| 牛人盗摄一区二区三区视频| 外国精品视频在线观看 | 成人性生活av| 欧美日韩性视频在线| 午夜免费福利小电影| 精精国产xxxx视频在线中文版 | 国产又粗又猛又黄视频| 丝袜国产日韩另类美女| 日本久久久久亚洲中字幕| 可以免费在线观看的av| 奶水喷射视频一区| 日本一区二区三区四区视频| 欧美一级片免费在线观看| 国产欧美日韩综合一区在线播放| 97视频色精品| 在线免费观看国产精品| 日韩**一区毛片| 国产精品一二三在线| 88av在线视频| 国产成人亚洲精品青草天美 | 神马久久一区二区三区| 中文字幕欧美日韩va免费视频| www成人啪啪18软件| 国产精品成人av| 欧美人与性动交a欧美精品| 国产性猛交普通话对白| 中文亚洲免费| 国产精品男女猛烈高潮激情| 亚洲中文字幕在线一区| 国产高清成人在线| 久久综合福利| 日本中文字幕电影在线免费观看| 一区二区免费在线| 国产极品粉嫩福利姬萌白酱| 天天综合网站| 日韩欧美国产一区二区三区| 欧美深性狂猛ⅹxxx深喉 | 日韩欧美一区二区三区在线观看| 欧美色图12p| 午夜激情视频网| 日韩欧美国产大片| 色妞久久福利网| 国产真实乱偷精品视频| 视频一区二区三区入口| 97超碰资源| 欧美大片aaa| 亚洲欧洲一区二区在线播放| 黄色一级在线视频| 欧美美女被草| 日韩av综合网站| 国内毛片毛片毛片毛片毛片| 亚洲人成久久| 91精品久久久久久久久| 四虎永久在线观看| 亚洲欧洲精品一区二区三区不卡| 日本欧美视频在线观看| 国产精品无码久久久久| 亚洲国产欧美一区二区丝袜黑人 | 欧美日韩另类在线| 三级性生活视频| 亚洲婷婷伊人| 欧美精品免费在线观看| 一级特黄免费视频| 成人18精品视频| 日本三级福利片| 亚洲成人看片| 亚洲大胆人体在线| 亚洲色偷偷综合亚洲av伊人| 天堂在线一区二区| 国产精品theporn88| 日本黄色片在线观看| 色综合久久久网| yy1111111| 欧美91大片| 成人黄色片网站| 国产小视频在线观看| 午夜久久久久久电影| 伊人五月天婷婷| 成人在线视频免费观看| 欧洲亚洲在线视频| 天天摸天天碰天天爽天天弄| 亚洲精品国产a久久久久久| 欧美日韩在线观看不卡| 中日韩免视频上线全都免费| 午夜精品国产精品大乳美女| 亚洲AV无码成人片在线观看| 亚洲视频在线观看一区| 一本色道久久亚洲综合精品蜜桃| 国产在线日韩精品| 日本伊人精品一区二区三区介绍| 乱色精品无码一区二区国产盗| 亚洲黄色免费网站| 人妻巨大乳一二三区| 国产精品毛片一区二区在线看| 国产成人在线一区二区| 你懂的免费在线观看视频网站| 欧美日韩免费网站| 性欧美18—19sex性高清| 欧美日韩hd| 91视频婷婷| 羞羞视频在线观看免费| 欧美变态凌虐bdsm| 久久中文字幕在线观看| 粉嫩嫩av羞羞动漫久久久| 黄色特一级视频| 亚洲专区**| 久久免费观看视频| 图片区 小说区 区 亚洲五月| 午夜精品久久久久久久99水蜜桃| 丰满人妻一区二区三区免费视频棣| 国产精品chinese| 国产精品一区二区欧美| 九色porny自拍视频在线播放 | 在线看的av网站| 欧美日韩国产综合一区二区三区 | 色综合一个色综合亚洲| 538国产视频| 石原莉奈在线亚洲三区| 亚洲午夜精品一区二区| 久久的色偷偷| 久久免费视频网站| 人成免费电影一二三区在线观看| 色8久久人人97超碰香蕉987| 亚洲aaa视频| 久久五月精品| 中文字幕一区二区三区四区免费看 | 久久网免费视频| 成人av网站大全| 爱福利视频一区二区| 欧美亚洲国产激情| 91青草视频久久| 91破解版在线观看| 亚洲天堂日韩电影| 999久久久久| 精品成人乱色一区二区| 日本美女xxx| 国产盗摄精品一区二区三区在线| 少妇av一区二区三区无码| 成人免费av| 99久久精品免费看国产一区二区三区 | 国产精品不卡在线| 性色av蜜臀av浪潮av老女人 | 国产精品久久久久久9999| 激情综合在线| 午夜精品一区二区三区四区| 91蜜桃臀久久一区二区| 国产精品美乳一区二区免费 | 婷婷开心激情综合| 波多野结衣家庭教师在线观看| 成人一区二区三区中文字幕| 中文字幕欧美人妻精品一区| 韩日在线一区| 欧美在线一二三区| 成人h动漫免费观看网站| 国产精品久久久久久搜索| 国产三级伦理在线| 色系列之999| 三级在线播放| 亚洲国产91精品在线观看| 国产精品久久久久久久久久久久久久久久| 亚洲国产精品影院| 美女视频久久久| 国产日韩欧美一区二区三区乱码| xxxxwww一片| 久久精品国产亚洲高清剧情介绍| 日本xxxxxxxxxx75| 中文字幕日韩一区二区不卡| 色视频一区二区三区| 嫩草国产精品入口| 亚洲va码欧洲m码| 欧美va在线| 日韩av片免费在线观看| 色戒汤唯在线观看| 久久久综合免费视频| 污污视频在线| 精品自在线视频| 国产在线观看91| 国产一区二区欧美日韩| 欧美视频免费一区二区三区| 亚洲国产精品小视频| 午夜精品一区二区三| 91精品国模一区二区三区| 伊人亚洲综合网| 欧美三级韩国三级日本一级| 免费又黄又爽又猛大片午夜| 欧美日韩中文在线| 国产成人在线播放视频| 亚洲成av人片在线观看无码| 欧美成人免费看| 一区二区三区日韩在线观看| 全网免费在线播放视频入口 | 91香蕉视频污| 亚洲天堂av网站| 成人avav影音| 538国产视频| 国产亚洲一区二区三区四区 | 成人无码一区二区三区| 欧美r级在线观看| 亚洲欧美另类综合| 亚洲白拍色综合图区| 人人妻人人玩人人澡人人爽| 亚洲国产毛片完整版| 日本在线一二三| 亚洲一区www| 黄色在线免费| 欧美激情久久久久| jizzjizz中国精品麻豆| 91chinesevideo永久地址| 天堂电影一区| 国产精品久久电影观看| 国产精品久久久久久吹潮| 成人疯狂猛交xxx| 中文在线综合| 九色综合日本| 日本女优一区| xxxxxx在线观看| 亚洲伦理一区| 久久久久国产精品熟女影院| 麻豆精品视频在线| 国产老头和老头xxxx×| 91玉足脚交白嫩脚丫在线播放| 白白色免费视频| 亚洲视频精选在线| 国产一级在线视频| 国产精品视频第一区| 99热国产免费| 久久精品福利| 欧美一区激情视频在线观看| 日韩欧美午夜| 国产在线视频综合| 亚洲综合电影一区二区三区| 丝袜制服一区二区三区| 国产乱子轮精品视频| 日本三级日本三级日本三级极| 久久综合狠狠综合久久激情 | 麻豆传媒视频在线观看免费| 欧美日韩免费视频| 国产福利第一页| 亚洲精品色婷婷福利天堂| 日本www在线| 91精品国产精品| 香蕉久久一区| 欧美国产二区| 欧美色综合网| 激情视频免费网站| 成人国产亚洲欧美成人综合网| 性网爆门事件集合av| 欧美性极品xxxx娇小| 一级爱爱免费视频| 精品国产欧美一区二区| 国产高清一级毛片在线不卡| 久热精品视频在线观看一区| 亚洲午夜天堂| 成人黄色片视频网站| 精品国产一区一区二区三亚瑟| 日本丰满大乳奶| 久久蜜桃精品| 最新日本中文字幕| 国产精品久久久久四虎| 中文字幕视频网站| 欧美大片一区二区| 日韩免费网站| 欧美在线xxx| 99re8这里有精品热视频免费| 日韩欧美一区二区视频在线播放| 怡红院精品视频在线观看极品| 91n.com在线观看| 国产成人精品免费在线| 无码人中文字幕| 在线观看日韩高清av| 熟妇人妻一区二区三区四区| 久精品免费视频| 91视频亚洲| 亚洲成人自拍视频| 久久久久国产精品午夜一区| 中文字幕人妻一区二区三区| 一区二区三区在线影院| 国产精品久久婷婷| 中文欧美在线视频| 99只有精品| 水蜜桃一区二区三区| 丝袜亚洲另类欧美| 人妻大战黑人白浆狂泄| 欧美视频国产精品| 三级视频在线| 奇米一区二区三区四区久久| 狼人精品一区二区三区在线| 欧美又粗又长又爽做受| 国产精品一区二区久激情瑜伽 | 中文字幕日韩精品一区| 中文字幕一级片| 色多多国产成人永久免费网站| 电影一区电影二区| 亚州欧美一区三区三区在线 | 最新中文字幕2018| 成人av资源在线| 日本熟妇一区二区| 亚洲加勒比久久88色综合| av资源在线| 免费一区二区三区| 久久久久久夜| 中文字幕有码在线播放| 欧美三级韩国三级日本三斤| 免费在线看a| 91超碰在线电影| 日韩一区二区免费看| 成人网站免费观看| 欧美午夜宅男影院在线观看| 毛片网站在线| 国产日韩综合一区二区性色av| 一区二区中文| zjzjzjzjzj亚洲女人| 色综合久久中文字幕综合网| а√天堂中文在线资源bt在线| 成人国产精品一区二区| 激情成人亚洲| 白白色免费视频| 在线播放中文字幕一区| 欧美人与禽性xxxxx杂性| 国内不卡一区二区三区| 日韩国产精品久久| 欧美日韩午夜视频| 精品成人一区二区三区| 精品国产第一福利网站| 中文字幕在线亚洲精品| 成人午夜私人影院| 懂色av中文字幕| 欧美成人精品一区二区| 欧洲亚洲一区二区三区| 91看片在线免费观看| 一区二区三区91| 韩国精品视频| 亚洲a中文字幕| 国产一区白浆| 小早川怜子一区二区的演员表| 精品久久五月天| 日本肉肉一区 | 三级黄色片在线观看| 国产亚洲午夜高清国产拍精品 | 欧美日韩高清| 91性高潮久久久久久久| 欧美日韩精品二区| 浪潮av一区| 免费亚洲一区二区| 国产成人综合视频| 欧美成人一区二区视频| 久久久久久久爱| 99精品网站| 波多野结衣福利|