最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

聊聊java中一些減少if else 的編碼習慣的方法

 更新時間:2019年08月30日 10:19:42   作者:一臺學習機  
這篇文章主要介紹了聊聊java中一些減少if else 的編碼習慣的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

前段時間在閱讀別人所寫的代碼的時候 , 發(fā)現(xiàn)其中一些業(yè)務(wù)相關(guān)的方法體內(nèi) , 出現(xiàn)了比較多的if-else語句多層嵌套的情況  . 首先我個人不是不提倡寫if-else語句 , 不得不說 , 很多時候 , 在寫某些邏輯 使用if-else 去做判斷 , 代碼看起來還是十分直觀的  , 但是如果濫用if-else , 形成多層嵌套或者形成, 其中每個case 還包含了大量的邏輯 , 此時從可讀性來說 , 使用if-else就有點得不償失了 .  而且某些時候 ,  可能并不需這么多的if-else , 或者是可以使用其他編碼方式從而達到減少的if-else 的效果  .

減少if-else 的使用的方式有很多 , 例如設(shè)計模式層面的策略模式或者是責任鏈模式 . 而這里跟大家分享一下一些個人在日常編碼過程中經(jīng)常用到的 , 比較簡單的  、從編碼習慣層面上的方式 , 去一些減少不必要if-else使用 . 由于本人只是一個小菜鳥 , 如果有寫得不對的地方 , 懇請批評指正 .

一些減少if-else的編碼方式

方式一 : 提前return

首先展示一段代碼示例 :

if (condition1) {
  if (condition2) {
    return getSomething();
  } else {
    return 0;
  }
} else {
  return 0;
}

修改后的代碼如下 :

//這里最好對這個flag所判斷的邏輯補充注釋進行描述
boolean flag = !condition1 || (condition1 && !condition2)
if(flag) {
 return 0;
}

if (condition1 && condition2) {
  return getSomething();
} 

如果存在已知在某些條件下 , 需要返回固定值的邏輯 , 可以將這部分邏輯抽取為一個獨立的 if-else block  , 并置于其他if-else block的前面 , 當符合該特定條件時 , 直接提前 return  固定值 . 這種方式最直接的效果就是降低if-else的嵌套數(shù)量 .

方式二 : 使用三目運算符

先上例子 , 這里以一個業(yè)務(wù)場景為例 :

查詢某條評論的圖片URL列表 (如果有 , 評論的圖片url列表以JSON數(shù)組字符串格式保存在評論表中)

修改前的代碼如下 :

Comment comment = getById(commentId);

if (Objects.isNull(comment)) {
  throw new RuntimeException("評論不存在或已被刪除");
}

String imgListStr = comment.getImgList();
if(StringUtils.isEmpty(imgListStr)) {
  return null;
}

return JSON.parseArray(imgListStr, String.class);

修改后 :

Comment comment = getById(commentId);

if (Objects.isNull(comment)) {
  throw new RuntimeException("評論不存在或已被刪除");
}

String imgListStr = comment.getImgList();
return StringUtils.isEmpty(imgListStr)) ?
  null : JSON.parseArray(imgListStr, String.class);

方式三 : 使用Assert斷言

在編寫業(yè)務(wù)代碼過程中 , 如果需要對某些特定的條件進行判斷 , 且當條件不滿足時需要拋出異常 . 對于這種場景 , 除了使用上面三目運算符的示例當中的if方式 , 還可以通過使用Spring Framework 給我們提供的 Assert  工具類進行 .
其中常用的API 有 :

  • isTrue(boolean expression , String message) : 當expressio == false時 , 會拋出異常 , 異常的message則為第二個入?yún)?;
  • void notNull(@Nullable Object object, String message) : 同上 , 當object == null 時 , 會拋出異常;
  • void notEmpty(@Nullable Collection<?> collection, String message) : 同上 , 當集合對象為null或者集合元素為空時 , 會拋出異常 .
  • .....

還有其他較多方法 , 可以直接看源碼的解析 , 當然實際上isTrue() 已經(jīng)夠用了 , 如果需要更加的語義化 , 可以使用對應(yīng)的API .

修改前代碼 :

if (Objects.isNull(comment)) {
  throw new RuntimeException("評論不存在或已被刪除");
}

修改后代碼 :

 Assert.isTrue(Objects.nonNull(comment),"評論不存在或已被刪除");
 Assert.notNull(comment,"評論不存在或已被刪除");

目前Assert工具方法只能拋出單一一種異常 java.lang.IllegalArgumentException , 如果需要自定義所拋出的異常 , 則該方式不適用 .

方式四 : 使用Optional

Optional是 java8 的新特性 , 相當于一個對象的容器 , 主要用于對象的null值校驗 , 以及在進行校驗后可鏈式地進行后續(xù)操作 , 如 : 拋出異常、null替換 等  .

其中我個人比較常用的幾個方法為 :

  • static <T> Optional<T> ofNullable(T value) :  使用Optional 將對象進行包裹 ;
  • T orElse(T other) :  Optional中的對象為null時 ,返回入?yún)⒌膶ο?.
  • T orElseGet(Supplier<? extends T> other) :  Optional中的對象為null時 , 返回Supplier 提供的值 ;
  • T orElseThrow(Supplier<? extends X> exceptionSupplier) :  Optional中的對象為null時 , 拋出supplier提供的自定義異常

代碼示例 :

Message message1 = Optional.ofNullable(getById(messageId))
  .orElseThrow(() -> new RuntimeException("消息不存在!"));

Message message2 = Optional.ofNullable(getById(messageId))
  .orElse(new Message());

Message message3 = Optional.ofNullable(getById(messageId))
  .orElseGet(Message::new);

由于我日常需要的進行空值判斷的比較多的場景是從數(shù)據(jù)庫查詢數(shù)據(jù)完畢時 , 需要查詢結(jié)果進行空值判斷 . 由于我所在的公司使用的持久層框架是mybatis  , 不像Spirng Boot 2.x 默認版本的JPA 那樣DAO層方法支持返回值為Optional , 所以這里如果需要使用Optional , 只能手動去使用上面列舉的第一個方法對查詢結(jié)果進行包裝 .

當然 , IDEA其實已經(jīng)給我們提供了該包裝方式的熱鍵了  , 如下圖所示 :

結(jié)語

個人的一些減少if-else 編碼習慣分享就這里了 , 這幾種方式里面 , 我個人覺得效果最明顯的還是第一種 提前return , 很多時候 , 提前return 也可以很好降低一段代碼的復(fù)雜度 .

當然如果必須要使用大量的if-else 去控制邏輯時 , 在每個condition 標明一下注釋還是一個挺不錯的習慣 .

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Springboot配置管理Externalized?Configuration深入探究

    Springboot配置管理Externalized?Configuration深入探究

    這篇文章主要介紹了Springboot配置管Externalized?Configuration深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • SpringBoot3.x集成nacos并實現(xiàn)多環(huán)境配置的操作步驟

    SpringBoot3.x集成nacos并實現(xiàn)多環(huán)境配置的操作步驟

    本文詳細介紹了如何在Springboot3.x中集成Nacos2.x版本,包括nacos的安裝、配置更改,以及在集成過程中遇到的問題,如端口設(shè)置、依賴版本調(diào)整等,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2024-10-10
  • SpringBoot2.0實現(xiàn)多圖片上傳加回顯

    SpringBoot2.0實現(xiàn)多圖片上傳加回顯

    這兩天公司有需求讓做一個商戶注冊的后臺功能,其中需要商戶上傳多張圖片并回顯,本文就使用SpringBoot2.0實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2021-07-07
  • spring cloud gateway網(wǎng)關(guān)路由分配代碼實例解析

    spring cloud gateway網(wǎng)關(guān)路由分配代碼實例解析

    這篇文章主要介紹了spring cloud gateway網(wǎng)關(guān)路由分配代碼實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • spring boot教程之全局處理異常封裝

    spring boot教程之全局處理異常封裝

    這篇文章主要給大家介紹了關(guān)于spring boot教程之全局處理異常封裝的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09
  • JAVA簡單鏈接Oracle數(shù)據(jù)庫 注冊和登陸功能的實現(xiàn)代碼

    JAVA簡單鏈接Oracle數(shù)據(jù)庫 注冊和登陸功能的實現(xiàn)代碼

    這篇文章主要介紹了JAVA鏈接Oracle并實現(xiàn)注冊與登錄功能的代碼實例,有需要的朋友可以參考一下
    2014-01-01
  • Quartz之Job與JobDetail深入解析

    Quartz之Job與JobDetail深入解析

    下面小編就為大家?guī)硪黄猀uartz之Job與JobDetail深入解析。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 一文讀懂a(chǎn)va中的Volatile關(guān)鍵字使用

    一文讀懂a(chǎn)va中的Volatile關(guān)鍵字使用

    volatile關(guān)鍵字的作用保證了變量的可見性(visibility)。被volatile關(guān)鍵字修飾的變量,如果值發(fā)生了變更,其他線程立馬可見,避免出現(xiàn)臟讀的現(xiàn)象。這篇文章主要介紹了ava中的Volatile關(guān)鍵字使用,需要的朋友可以參考下
    2020-03-03
  • spring源碼下載、編譯、debug的詳細教程

    spring源碼下載、編譯、debug的詳細教程

    這篇文章主要介紹了spring源碼下載、編譯、debug的詳細教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Java Serializable和Parcelable詳解及實例代碼

    Java Serializable和Parcelable詳解及實例代碼

    這篇文章主要介紹了Java Serializable和Parcelable詳解,并附實例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-09-09

最新評論

体育| 宁蒗| 岳池县| 永清县| 高唐县| 鄱阳县| 南华县| 河南省| 达拉特旗| 新疆| 霍州市| 斗六市| 莱州市| 高台县| 清远市| 孙吴县| 汾阳市| 墨玉县| 无为县| 翁牛特旗| 咸阳市| 韩城市| 万年县| 定西市| 缙云县| 尼玛县| 汶上县| 灌南县| 开远市| 沾化县| 南充市| 克东县| 九江县| 汉阴县| 沧州市| 重庆市| 星座| 邛崃市| 瑞丽市| 镇安县| 林芝县|