欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

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

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

方式一 : 提前return

首先展示一段代碼示例 :

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

修改后的代碼如下 :

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

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

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

方式二 : 使用三目運(yùn)算符

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

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

修改前的代碼如下 :

Comment comment = getById(commentId);

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

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("評(píng)論不存在或已被刪除");
}

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

方式三 : 使用Assert斷言

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

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

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

修改前代碼 :

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

修改后代碼 :

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

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

方式四 : 使用Optional

Optional是 java8 的新特性 , 相當(dāng)于一個(gè)對(duì)象的容器 , 主要用于對(duì)象的null值校驗(yàn) , 以及在進(jìn)行校驗(yàn)后可鏈?zhǔn)降剡M(jìn)行后續(xù)操作 , 如 : 拋出異常、null替換 等  .

其中我個(gè)人比較常用的幾個(gè)方法為 :

  • static <T> Optional<T> ofNullable(T value) :  使用Optional 將對(duì)象進(jìn)行包裹 ;
  • T orElse(T other) :  Optional中的對(duì)象為null時(shí) ,返回入?yún)⒌膶?duì)象 .
  • T orElseGet(Supplier<? extends T> other) :  Optional中的對(duì)象為null時(shí) , 返回Supplier 提供的值 ;
  • T orElseThrow(Supplier<? extends X> exceptionSupplier) :  Optional中的對(duì)象為null時(shí) , 拋出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);

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

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

結(jié)語(yǔ)

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

當(dāng)然如果必須要使用大量的if-else 去控制邏輯時(shí) , 在每個(gè)condition 標(biāo)明一下注釋還是一個(gè)挺不錯(cuò)的習(xí)慣 .

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mybatis深度整合Mysql的Json字段問(wèn)題

    Mybatis深度整合Mysql的Json字段問(wèn)題

    這篇文章主要介紹了Mybatis深度整合Mysql的Json字段問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • spring-boot react如何一步一步實(shí)現(xiàn)增刪改查

    spring-boot react如何一步一步實(shí)現(xiàn)增刪改查

    這篇文章主要介紹了spring-boot react如何一步一步實(shí)現(xiàn)增刪改查,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • 詳解path和classpath的區(qū)別

    詳解path和classpath的區(qū)別

    這篇文章主要介紹了詳解path和classpath的區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • RabbitMQ下載與安裝教程

    RabbitMQ下載與安裝教程

    RabbitMQ是實(shí)現(xiàn)了高級(jí)消息隊(duì)列協(xié)議(AMQP)的開(kāi)源消息代理軟件(亦稱面向消息的中間件),這篇文章給大家介紹RabbitMQ下載與安裝教程,感興趣的朋友跟隨小編一起看看吧
    2024-02-02
  • Java讀取txt文件的方法

    Java讀取txt文件的方法

    這篇文章主要為大家詳細(xì)介紹了Java讀取txt文件的方法,分享Java讀取txt文件代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 自從在 IDEA 中用了熱部署神器 JRebel 之后,開(kāi)發(fā)效率提升了 10(真棒)

    自從在 IDEA 中用了熱部署神器 JRebel 之后,開(kāi)發(fā)效率提升了 10(真棒)

    在javaweb開(kāi)發(fā)過(guò)程中,使用熱部署神器 JRebel可以使class類還是更新spring配置文件都能立馬見(jiàn)到效率,本文給大家介紹JRebel的兩種安裝方法,小編建議使用第二種方法,具體安裝步驟跟隨小編一起看看吧
    2021-06-06
  • Spring Cloud下實(shí)現(xiàn)用戶鑒權(quán)的方案

    Spring Cloud下實(shí)現(xiàn)用戶鑒權(quán)的方案

    Java下常用的安全框架主要有Spring Security和shiro,都可提供非常強(qiáng)大的功能,但學(xué)習(xí)成本較高。但在微服務(wù)下鑒權(quán)又會(huì)對(duì)服務(wù)有一定的入侵性。 因此,本文將介紹Spring Cloud下實(shí)現(xiàn)用戶鑒權(quán)的方案,感興趣的同學(xué)可以關(guān)注一下
    2021-11-11
  • J2SE基礎(chǔ)之在Eclipse中運(yùn)行hello world

    J2SE基礎(chǔ)之在Eclipse中運(yùn)行hello world

    本文的內(nèi)容非常的簡(jiǎn)單,跟隨世界潮流,第一個(gè)Java程序輸出“Hell World!”。希望大家能夠喜歡
    2016-05-05
  • springcloud項(xiàng)目改名的操作方法

    springcloud項(xiàng)目改名的操作方法

    這篇文章主要介紹了springcloud項(xiàng)目改名的操作方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 詳解Springboot之整合JDBCTemplate配置多數(shù)據(jù)源

    詳解Springboot之整合JDBCTemplate配置多數(shù)據(jù)源

    這篇文章主要介紹了詳解Springboot之整合JDBCTemplate配置多數(shù)據(jù)源,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04

最新評(píng)論