精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲一区二区在线| 美女精品久久久| 亚洲欧美激情网| 在线观看国产原创自拍视频| 国产精品一二三在| 欧美一性一乱一交一视频| 欧日韩不卡视频| 99久热这里只有精品视频免费观看| 精品人伦一区二区三区蜜桃免费| 午夜精品视频在线观看一区二区| 亚洲精品国产手机| 日本vs亚洲vs韩国一区三区| 欧美大尺度在线观看| 波多野结衣福利| 精品中文字幕一区二区三区四区| 懂色av影视一区二区三区| 亚洲一区二区在线免费观看| 黄色一级a毛片| 久久成人免费网站| 97超级碰在线看视频免费在线看| 国产激情无码一区二区三区| 欧美极品中文字幕| 精品国产成人系列| 欧美视频亚洲图片| 三上悠亚一区二区| 亚洲福利国产精品| 中国一级黄色录像| 第三区美女视频在线| 成人小视频在线观看| 成人黄色生活片| 亚洲国产成人精品女人久久| 亚洲一级黄色| 久久亚洲欧美日韩精品专区| 国产综合精品在线| 日韩理论电影中文字幕| 欧美va在线播放| 91pony九色| 国产精品久久久久久久久久齐齐| 丰满岳妇乱一区二区三区| 亚洲精品高清视频| 国产视频第一区| 久久久无码精品亚洲日韩按摩| 超碰97在线资源| 国产乱叫456在线| 麻豆91在线播放| 国产脚交av在线一区二区| 国产三级av片| 国产一级久久| 欧洲亚洲女同hd| 99热只有这里有精品| 91久久午夜| 久久久噜噜噜久久| 国产精品第72页| 影音先锋一区| 久久久噜噜噜久噜久久| 国产亚洲欧美久久久久| 欧美激情1区| 久久久久久久久久久av| 久久黄色免费视频| 最新亚洲激情| 欧美一级电影免费在线观看| 国产精品100| 老司机久久99久久精品播放免费| 热99久久精品| 九九热最新视频| 免费观看在线综合| 91视频免费在线| 成人高潮片免费视频| 国产成人精品亚洲日本在线桃色| 91九色视频在线观看| 精品国产九九九| 成人av在线电影| 欧美二区三区在线| yw视频在线观看| **欧美大码日韩| 免费看欧美一级片| 亚洲美女久久精品| 欧美色精品天天在线观看视频| 天天操狠狠操夜夜操| 亚洲1区在线| 日韩激情第一页| 亚洲精品成人av久久| 国产精品久久久久蜜臀| 久久久久久久久久久免费精品| 亚洲高清毛片一区二区| 日韩**一区毛片| 51国偷自产一区二区三区| 亚洲精品一区二区三区蜜桃| 26uuu精品一区二区| 天天综合色天天综合色hd| 97超碰资源站在线观看| 姬川优奈aav一区二区| 无遮挡又爽又刺激的视频| 欧美少妇激情| 亚洲国产毛片完整版| 中文字幕有码在线播放| 在线国产一区| 日韩av理论片| 亚洲国产精彩视频| 欧美国产一区在线| 精品丰满人妻无套内射| 国产激情久久| 日韩电影大片中文字幕| 国产精品精品软件男同| 亚洲理论在线| 国产一区视频在线播放| 色偷偷在线观看| 中文字幕一区免费在线观看| 香港三级韩国三级日本三级| 久久伊人国产| 亚洲片国产一区一级在线观看| 农村黄色一级片| 视频在线观看国产精品| 国产激情一区二区三区在线观看| 高清美女视频一区| 欧美日韩在线免费观看| 超碰人人cao| 久久理论电影| 日本国产高清不卡| 日本xxxx人| 亚洲精品第一国产综合野| 亚洲成色www.777999| 老汉色老汉首页av亚洲| 欧美精品免费播放| 伊人免费在线观看| 久久久久久久综合狠狠综合| 精品一二三四五区| 美女精品久久| 日韩视频永久免费观看| 成人小视频在线播放| 91色porny在线视频| 国产a级黄色大片| 成人午夜888| 正在播放亚洲1区| 国产三级精品三级在线观看| www.成人网.com| 久久亚洲a v| 麻豆视频久久| 精品中文字幕在线观看| 国产精品久久久久久久久久久久久久久久 | 91丨porny丨探花| 日本一区二区三区播放| 久久久精品免费视频| 一级全黄少妇性色生活片| 国产婷婷色一区二区三区四区| 国内外成人激情视频| 精品素人av| 韩国三级电影久久久久久| 亚洲第一大网站| 亚洲国产婷婷综合在线精品| 日本黄色www| 欧美片第1页综合| 春色成人在线视频| h片在线观看视频免费免费| 精品国产三级电影在线观看| 日本熟妇毛茸茸丰满| av在线不卡电影| 日韩精品―中文字幕| 亚洲第一福利专区| 国产精品91久久久| 91在线视频| 91精品国产综合久久福利| 久久r这里只有精品| 国产v综合v亚洲欧| 亚洲 欧美 日韩 国产综合 在线| 亚洲影院天堂中文av色| 国产成人福利视频| 日本暖暖在线视频| 日韩欧美国产午夜精品| 日操夜操天天操| 久久婷婷综合激情| 国产日韩欧美久久| 中文字幕一区二区三三| 国产免费一区| 国偷自产一区二区免费视频| 正在播放欧美视频| 亚洲成人精品女人久久久| 亚洲成a天堂v人片| 熟女少妇内射日韩亚洲| 国产在线不卡一区| 国产69精品久久久久999小说| 香蕉人人精品| 国产在线精品播放| heyzo高清国产精品| 亚洲人av在线影院| 国产视频aaa| 欧美丝袜第一区| 日本视频在线免费| 成人av电影在线播放| 天天操天天爱天天爽| 欧美特黄视频| 日韩精品一线二线三线| 视频一区日韩| 欧美洲成人男女午夜视频| 国产黄网站在线观看| 日韩精品视频免费| 97精品久久人人爽人人爽| 午夜精品一区二区三区免费视频 | 91九色蝌蚪porny| 久久青草久久| 人妻无码一区二区三区四区| 国产欧美日韩| 国产精品免费一区二区三区| 岛国精品在线| 91精品国产精品| а√天堂资源地址在线下载| 亚洲欧美日韩中文视频| 精品久久久久成人码免费动漫| 色婷婷精品久久二区二区蜜臀av| 亚洲熟女www一区二区三区| 久久九九久精品国产免费直播| 杨幂一区二区国产精品| 日韩中文字幕一区二区三区| 免费观看国产精品视频| 性xxxx欧美老肥妇牲乱| 日本一区不卡| 五月激激激综合网色播| 成人黄色片视频网站| 日本久久一区| 国产脚交av在线一区二区| 男人的天堂免费在线视频| 九九热精品在线| 免费在线观看av网站| 亚洲人成电影在线| 三级视频在线看| 日韩欧美精品三级| 国产乱码精品一区二三区蜜臂 | 欧美另类69xxxxx| 激情视频在线观看一区二区三区| 麻豆视频久久| 97se在线视频| 国产视频一区二| 国产日韩中文在线| 欧美美女被草| 国产精品中文在线| 精品三级在线| 国产精品亚发布| 97成人超碰| 国产精品扒开腿爽爽爽视频| 亚洲精品中文字幕| 热草久综合在线| 中老年在线免费视频| 91国产视频在线播放| 国产v日韩v欧美v| 午夜伦理精品一区| 日韩脚交footjobhdboots| 69av成年福利视频| 亚洲深夜视频| 茄子视频成人在线| 99re66热这里只有精品4| 日韩av大片在线| 欧美xnxx| 91精品国产综合久久久久久蜜臀| 国产精品美女午夜爽爽| 国产人妖伪娘一区91| 高清国产一区二区三区四区五区| 成人精品一区二区三区| 九九99久久精品在免费线bt| 99久久99久久精品国产片| 岛国成人av| 精品综合久久| 精品精品99| 一区二区三区我不卡| 国产精品伦理久久久久久| 特大黑人娇小亚洲女mp4| 亚洲性色视频| 无码aⅴ精品一区二区三区浪潮 | 欧美精品三区| 无码粉嫩虎白一线天在线观看 | 午夜久久美女| 国产男女免费视频| 首页国产欧美日韩丝袜| caoporm在线视频| 成人免费黄色在线| 无码国产69精品久久久久同性| 国产精品欧美综合在线| 久久久久久久久毛片| 欧美日韩激情网| 中文字幕日产av| 欧美大片免费久久精品三p| 色综合久久久久久| 中文字幕久久久| 色yeye免费人成网站在线观看| 欧美亚洲日本黄色| 国产精品久久久久久av公交车| 都市激情久久久久久久久久久| 青青草久久爱| 中文字幕一区二区三区四区五区六区 | 成年人深夜视频| 日韩1区2区日韩1区2区| 日韩大尺度视频| 国产欧美视频一区二区| avtt天堂在线| 在线观看日韩一区| 亚洲精品成人电影| 在线看日韩欧美| 国产精品原创| 91麻豆桃色免费看| 久久99高清| 国产一区二区片| 男人操女人的视频在线观看欧美 | 国产午夜亚洲精品不卡| 好吊色视频在线观看| 色婷婷久久综合| 亚洲国产日韩在线观看| 中文字幕欧美日韩va免费视频| 国产网红女主播精品视频| 国产精品久久久久久久久久久久| 91精品国产乱码久久久竹菊| 视频一区二区在线观看| 中日韩男男gay无套| 日韩av影视大全| 欧美国产禁国产网站cc| 在线看成人av| 欧美一区二区三区在线看| 岛国视频免费在线观看| 久久久亚洲影院你懂的| 久久精品九色| 亚洲欧美影院| 老司机精品久久| 中文字幕人妻一区二区| 亚洲成人综合网站| 性欧美8khd高清极品| 久久久97精品| 欧美激情三区| 亚洲一区高清| 免费亚洲电影在线| 91成人破解版| 欧美日韩一区二区免费视频| 黄色小视频免费观看| 欧美伦理91i| 久久影院一区二区三区| 国产日韩视频在线播放| 麻豆成人av在线| 美女网站视频色| 欧美美女一区二区在线观看| av免费观看一区二区| 国产精品成av人在线视午夜片 | 日韩色性视频| 亚洲不卡1区| 亚洲男女自偷自拍| www.色多多| 欧美性猛交xxxx免费看久久久| 亚洲 精品 综合 精品 自拍| 高清欧美性猛交xxxx| 91午夜精品| 丁香花在线影院观看在线播放| 丁香婷婷综合网| 国产午夜福利片| 亚洲国产三级网| 日韩激情电影免费看| 久久亚洲一区二区| 石原莉奈在线亚洲三区| 波多野结衣av在线观看| 欧美亚洲国产bt| 天天影视久久综合| 亚洲一区二区三区四区视频| 欧美激情日韩| 亚洲一区二区在线免费| 欧美日韩免费观看中文| 黄色在线网站| 国产日韩av在线| 欧美国产综合| 亚洲中文字幕一区| 91久久线看在观草草青青| www 日韩| 亚洲aaaaaa| 亚洲美女91| 黄免费在线观看| 欧美久久久一区| 牛牛在线精品视频| 久久精品国产精品国产精品污| 久久在线精品| 糖心vlog免费在线观看| 欧美白人最猛性xxxxx69交| sm久久捆绑调教精品一区| 日本不卡久久| 国产伦精品一区二区三区视频青涩 | 国产一区二区中文| 一区二区视频观看| 欧美日韩一区二区在线视频| 最新黄网在线观看| 美女被啪啪一区二区| 久久99国产精品成人| 日本熟女一区二区| 中文字幕在线成人| 国产精品极品国产中出| 91n.com在线观看| 亚洲综合色噜噜狠狠| 高清毛片在线看| 国产伦理久久久| 另类欧美日韩国产在线| 国产精品.www| 尤物yw午夜国产精品视频| 一区视频网站| 黄色片视频在线| 第一福利永久视频精品| 国产福利在线播放麻豆| 免费亚洲一区二区| 粉嫩一区二区三区在线看|