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

談談在Java中如何優雅地判空

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

判空災難

談談在Java中如何優雅地判空

 

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

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

[[321748]]

 

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

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

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

談談在Java中如何優雅地判空

 

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

談談在Java中如何優雅地判空

 

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

談談在Java中如何優雅地判空

 

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

NullObject模式

對于項目中無數次的判空,對代碼質量整潔度產生了十分之惡劣的影響,對于這種現象,我們稱之為“判空災難”。

那么,這種現象如何治理呢,你可能聽說過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模式首次發表在“ 程序設計模式語言 ”系列叢書中。一般的,在面向對象語言中,對對象的調用前需要使用判空檢查,來判斷這些對象是否為空,因為在空引用上無法調用所需方法。

空對象模式的一種典型實現方式如下圖所示(圖片來自網絡):

談談在Java中如何優雅地判空

 

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

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

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

這個接口定義了業務對象的行為。

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

這是該對象的真實類,實現了業務行為接口DependencyBase與空對象操作接口Nullable。

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

這是空對象,對原有對象的行為進行了空實現。

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

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

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

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

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

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

.NR Null Object

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

  1. 分析所選類可聲明為接口的方法;
  2. 抽象出公有接口;
  3. 創建空對象,自動實現公有接口;
  4. 對部分函數進行可為空聲明;
  5. 可追加函數進行再次生成;
  6. 自動的函數命名規范
讓我們來看一個使用范例:

談談在Java中如何優雅地判空

 

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

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

安裝方式

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

選擇 Preferences → Plugins → Browse repositories

談談在Java中如何優雅地判空

 

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

談談在Java中如何優雅地判空

 

Optional

還有一種方式是使用Java8特性中的Optional來進行優雅地判空,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()將返回該值。

話不多說,舉個例子。

[[321750]]

 

有如下代碼,需要獲得Test2中的Info信息,但是參數為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是否為空,如果為空,繼續返回第一步中的單例Optional對象,否則調用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)同上調用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,為空則返回傳入的參數作為默認值。

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

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

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

談談在Java中如何優雅地判空

 

你也可以直接引入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.       // orfor Android: 
  4.       api 'com.google.guava:guava:27.0-android' 
  5.     } 

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

談談在Java中如何優雅地判空

 

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

談談在Java中如何優雅地判空

 

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

使用Optional具有如下優點:
  1. 將防御式編程代碼完美包裝
  2. 鏈式調用
  3. 有效避免程序代碼中的空指針
但是也同樣具有一些缺點:
  1. 流行性不是非常理想,團隊新成員需要學習成本
  2. 安卓中需要引入Guava,需要團隊每個人處理IDEA默認提示,或者忍受黃色提示

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

[[321751]]

 

Kotlin

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

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

如果你已經開始使用了Kotlin,可以不用再寫繚亂的防御判空語句。如果你還沒有使用Kotlin,并不推薦為了判空優雅而直接轉向Kotlin。 

責任編輯:龐桂玉 來源: 今日頭條
相關推薦

2020-09-25 11:30:20

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接口數據

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電腦數據

2023-12-20 13:50:00

SpringBootJSON序列化

2024-11-21 09:00:00

Python字典代碼

2020-02-05 14:05:21

Java技術數組

2021-05-12 22:07:43

并發編排任務

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事務編程

2021-01-28 14:53:19

PHP編碼開發
點贊
收藏

51CTO技術棧公眾號

懂色av一区| 99久久精品免费看国产交换| 亚洲欧美成人vr| 欧美探花视频资源| 久久免费视频2| 人妻一区二区三区四区| 久久久天天操| 久久久av一区| 手机在线看片日韩| 国产成人77亚洲精品www| 亚洲免费观看视频| 欧美一区视久久| 91麻豆成人精品国产| 在线观看一区| 日韩性生活视频| 亚洲一区二区在线免费| 成人免费视频观看| 亚洲成人动漫av| 在线视频一区观看| 色综合888| 国产尤物一区二区在线| 4388成人网| 日本妇女毛茸茸| 国产成人一区二区三区影院| 日韩一区二区三区四区| 男人舔女人下面高潮视频| 在线āv视频| 欧美国产一区视频在线观看| 国产区日韩欧美| 国产又粗又长视频| 日韩黄色在线观看| 性视频1819p久久| 日韩在线中文字幕视频| 国产一区网站| 亚洲美女中文字幕| fc2成人免费视频| 91丨精品丨国产| 欧美影视一区在线| 91视频最新入口| 男人添女人下部高潮视频在线观看| 中文天堂在线一区| 久久精品aaaaaa毛片| 亚洲免费一级片| 国产一区二区三区蝌蚪| 国产日韩欧美一二三区| 五月天中文字幕| 久久综合影视| 日本高清不卡的在线| 国产成人愉拍精品久久| 狠狠色狠狠色综合日日tαg| 久热精品视频在线观看| 中文字幕91视频| 日韩国产欧美一区二区| 国产亚洲欧美另类中文| 91国模少妇一区二区三区| 欧亚精品一区| 亚洲欧美在线播放| 粉嫩av蜜桃av蜜臀av| 一区二区美女| 国产一区二区三区在线视频| jizz中文字幕| 欧美日韩一二| 色av中文字幕一区| 精品熟妇无码av免费久久| 九九久久成人| 国产亚洲福利一区| 国产精品无码无卡无需播放器| 欧美日韩在线二区| 日韩视频免费在线| 国产第一页浮力| 欧美亚韩一区| 97成人精品区在线播放| 亚洲图片在线视频| 奇米影视一区二区三区小说| 国产在线观看精品| 99在线无码精品入口| 国产高清视频一区| 国产视频一区二区三区四区| 日本在线丨区| 欧美高清在线精品一区| 一区二区在线不卡| 18网站在线观看| 亚洲国产视频一区| 免费无码av片在线观看| 国产成人精品一区二区三区免费| 在线成人免费视频| 四虎永久免费观看| 日韩动漫一区| 主播福利视频一区| 欧美精品乱码视频一二专区| 99精品视频免费观看| 国产精品av电影| 99在线精品视频免费观看软件| 成人的网站免费观看| 欧美另类一区| 黄在线免费观看| 亚洲一区二区三区三| 久久久噜噜噜www成人网| 欧美少妇激情| 亚洲第一视频在线观看| 日本成人午夜影院| 中文字幕人成人乱码| 91av成人在线| jizz中国女人| 久久精品人人做人人综合 | 久久99久久99精品中文字幕| 久久国产精品系列| 韩国av一区二区三区在线观看| 国产亚洲欧美另类一区二区三区 | 久久久久99精品久久久久| 国产一级片网址| 美国av一区二区| 精品国产一区二区三区日日嗨| 生活片a∨在线观看| 精品国产91乱高清在线观看| 九九热视频免费| 国产调教一区二区三区| 欧美激情一区二区三区在线视频观看| 中文资源在线播放| 91网上在线视频| 日本一本中文字幕| 粉嫩一区二区三区在线观看| 在线观看亚洲区| av图片在线观看| 国产东北露脸精品视频| 亚洲精品一品区二品区三品区| 欧美激情20| 亚洲精品在线三区| 国产suv精品一区二区68| 视频一区中文字幕国产| 精品在线视频一区二区三区| 欧美巨大xxxx做受沙滩| 91精品国产色综合久久久蜜香臀| 1024手机在线观看你懂的| 亚欧美中日韩视频| 国产精品久久久对白| 日本在线看片免费人成视1000| 在线观看91视频| 熟女俱乐部一区二区视频在线| 在线欧美亚洲| 国产激情美女久久久久久吹潮| gogo在线观看| 欧美乱妇15p| 长河落日免费高清观看| 日韩极品在线观看| 天堂资源在线亚洲资源| 姬川优奈av一区二区在线电影| 国产视频一区在线| 欧美 日韩 精品| 久久久一区二区三区| 黑森林福利视频导航| 亚洲永久精品唐人导航网址| 2021久久精品国产99国产精品| 神马久久高清| 一本色道久久综合亚洲91 | 免费观看久久av| 欧美亚洲国产日韩2020| 熟妇人妻av无码一区二区三区| 亚洲一区视频在线| 这里只有精品在线观看视频| 国产日韩视频| 欧洲亚洲一区二区| 九七影院97影院理论片久久 | 黄色国产在线播放| 麻豆精品一区二区三区| 中文字幕中文字幕99| 国产亚洲亚洲国产一二区| 欧美日本亚洲视频| 高潮毛片7777777毛片| 亚洲.国产.中文慕字在线| 国产高清成人久久| 亚洲免费中文| 亚洲不卡1区| 成人免费一区| 九九久久精品一区| 天天av天天翘| 在线观看一区日韩| 情侣偷拍对白清晰饥渴难耐| 国产成人a级片| 男人揉女人奶房视频60分| 国产日韩欧美一区二区三区| 成人国产亚洲精品a区天堂华泰| 4438x成人网全国最大| 亚洲国模精品私拍| 黄色在线观看国产| 综合久久久久久久| 国产麻豆xxxvideo实拍| 免费在线观看视频一区| 大陆极品少妇内射aaaaaa| 欧美黑人做爰爽爽爽| 国产精品一区二区三区在线播放| 丝袜国产在线| 亚洲欧美激情视频| 国产三级漂亮女教师| 欧美日韩在线视频首页| 少妇高潮惨叫久久久久| 成人免费视频视频在线观看免费| 日韩一级在线免费观看| 综合久久十次| 水蜜桃亚洲一二三四在线| 欧美电影院免费观看| 日本成人黄色片| 日本一本在线免费福利| 国产丝袜精品第一页| 国产欧美久久久精品免费| 日韩欧美有码在线| 黄色一级免费视频| 国产日韩亚洲欧美综合| 亚洲乱妇老熟女爽到高潮的片| 日韩va亚洲va欧美va久久| 欧美激情亚洲天堂| 日韩在线二区| 欧美一级二级三级| 北条麻妃一区二区三区在线观看| 国产精品视频免费在线| 女人让男人操自己视频在线观看| 精品国产一区二区三区久久狼5月| 香蕉视频国产在线| 日韩亚洲国产中文字幕欧美| 亚洲影视一区二区| 色综合久久中文字幕综合网| 一区二区三区免费高清视频| 国产精品色呦呦| 扒开jk护士狂揉免费| 成人美女在线视频| 一区二区三区人妻| 黄色日韩网站视频| 亚洲欧美自拍另类日韩| 老司机精品久久| 亚洲熟妇无码另类久久久| 欧美日韩久久| 97av中文字幕| 亚洲影视一区二区三区| 在线播放豆国产99亚洲| 欧美先锋资源| 日产国产精品精品a∨| 综合亚洲自拍| 久久精品国产美女| 欧美日韩一区二区三区四区不卡| 国产成人精品一区二区三区福利 | 国产一区喷水| 白白在线精品| 国产精品对白刺激久久久| 日韩高清在线观看一区二区| 91亚洲永久免费精品| 电影中文字幕一区二区| 91免费人成网站在线观看18| 四虎影视成人精品国库在线观看 | 欧美 亚洲 另类 激情 另类| 91国在线观看| 中国老头性行为xxxx| 欧美性色欧美a在线播放| 波多野结衣在线观看一区| 一本大道久久a久久综合婷婷 | 国产写真视频在线观看| 久久不射热爱视频精品| caopeng在线| 久久成人亚洲精品| 欧美人与性动交α欧美精品济南到| 欧美黑人xxxx| 国产传媒在线观看| 日韩美女视频在线观看| 欧美特大特白屁股xxxx| 国产精品r级在线| 国产黄色精品| 91视频最新| 久9re热视频这里只有精品| 草莓视频一区| 亚洲婷婷影院| 亚洲欧洲中文| 在线中文一区| 成年人视频观看| 日韩av高清在线观看| 中文字幕 日韩 欧美| 国产精品亚洲第一区在线暖暖韩国 | 日日夜夜精品视频天天综合网| 亚洲综合日韩欧美| 国产一区二区三区四区五区入口 | 精品中文字幕一区二区三区四区| 91超碰rencao97精品| 欧美日韩大片免费观看| 日韩欧美视频第二区| 99成人超碰| 欧美视频在线观看视频| 日本免费新一区视频| 亚洲自拍第三页| av亚洲精华国产精华精华| 色婷婷国产精品免| 亚洲国产精品人人做人人爽| 国产乱码77777777| 欧美va亚洲va| 成人免费在线视频网| 欧美成人午夜激情视频| 色多多在线观看| 91久久中文字幕| 亚瑟一区二区三区四区| 成人短视频在线看| 免费亚洲一区| 日本少妇一级片| 中文字幕国产精品一区二区| 伊人国产在线观看| 欧美日本一区二区在线观看| 天堂av中文字幕| 久久精品视频免费播放| 国产精欧美一区二区三区蓝颜男同| 亚洲自拍偷拍色片视频| 亚洲电影一级片| 欧美国产综合在线| 免费高清成人在线| 黄色录像a级片| 亚洲精品国产第一综合99久久 | 超免费在线视频| 国产精品视频网| 欧美黄色网视频| 99久久久精品视频| 狠狠色丁香久久婷婷综合_中| 欧美特级黄色录像| 午夜私人影院久久久久| 国产精品亚洲lv粉色| 一个人看的www久久| 美女扒开腿让男人桶爽久久软| 91超碰rencao97精品| 欧美黄色大片在线观看| 国产精品一区二区羞羞答答| 91色婷婷久久久久合中文| 国产亚洲欧美久久久久| 欧美一级在线视频| 国产在线观看a视频| 国产精品视频午夜| 精品久久久久久久久久久下田| 69堂免费视频| 99视频一区二区三区| 久久精品美女视频| 欧美变态凌虐bdsm| 91精品久久| 91久久久久久久久| 水蜜桃久久夜色精品一区| 性欧美极品xxxx欧美一区二区| 久久综合国产精品| 亚洲久久在线观看| 日韩高清有码在线| 天堂网在线最新版www中文网| 国产精品青青草| 国产在线成人| 欧美xxxx日本和非洲| 亚洲综合av网| 亚洲精品久久久狠狠狠爱| 久久99精品久久久久久噜噜| 日韩第一区第二区| 欧美成人精品免费| 成人毛片在线观看| 中日韩黄色大片| 精品亚洲一区二区三区| 中文在线免费二区三区| 蜜桃欧美视频| 久久伊人亚洲| 国产精品久久免费观看| 欧美日韩一级大片网址| 午夜免费视频在线国产| 成人做爽爽免费视频| 欧美在线网址| 精品人妻在线视频| 精品国产乱码久久久久久天美| 日本一卡二卡四卡精品| 国产aaa精品| 久久国产精品亚洲人一区二区三区| 制服丝袜中文字幕第一页| 曰韩精品一区二区| 亚洲 精品 综合 精品 自拍| 国产v综合v亚洲欧美久久| 欧美a级片视频| 第一页在线视频| 黑人巨大精品欧美一区二区三区| 国产乱理伦片a级在线观看| 国产日韩专区在线| 国模大胆一区二区三区| 97伦伦午夜电影理伦片| 欧美日韩精品三区| 污污视频在线| 欧美一区二区高清在线观看| 久久成人综合网| 国产成人啪精品午夜在线观看| 亚洲欧美中文日韩v在线观看| 日本成人在线网站| 韩日视频在线观看| 国产免费观看久久| 性生活黄色大片| 国产91精品在线播放| 亚洲精品在线观看91| 青青草成人免费视频| 欧美美女bb生活片| 日本在线啊啊| 一区二区三区日韩视频| 99热99精品| 91国内精品久久久| 久久久久久高潮国产精品视| 欧美理论电影大全| 又黄又爽的网站| 911精品国产一区二区在线| 日韩av影片|