日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

一種避免大量If-else代碼的新思路

來源: 責編: 時間:2024-04-26 17:34:52 251觀看
導讀哈嘍,各位代碼戰士們,我是Jensen,一個夢想著和大家一起在代碼的海洋里遨游,順便撿起那些散落的知識點的程序員小伙伴。今天,我要給大家帶來一個超級無敵霹靂的編碼新招式,只要看完,保證你的代碼像用了某某洗發水一樣,不僅去屑

3sn28資訊網——每日最新資訊28at.com

哈嘍,各位代碼戰士們,我是Jensen,一個夢想著和大家一起在代碼的海洋里遨游,順便撿起那些散落的知識點的程序員小伙伴。3sn28資訊網——每日最新資訊28at.com

今天,我要給大家帶來一個超級無敵霹靂的編碼新招式,只要看完,保證你的代碼像用了某某洗發水一樣,不僅去屑還更柔順。3sn28資訊網——每日最新資訊28at.com

咱們要聊的是那些讓人又愛又恨的技術點:自定義異常、全局異常捕獲、斷言。3sn28資訊網——每日最新資訊28at.com

一、控制異常流程

首先,讓我們來聊聊自定義異常。3sn28資訊網——每日最新資訊28at.com

你知道的,在Java的世界里,我們通常用if-else語句來檢查那些讓人頭疼的條件。3sn28資訊網——每日最新資訊28at.com

比如用戶登錄:3sn28資訊網——每日最新資訊28at.com

// 偽代碼if (驗證碼 != 8888) {    return "驗證碼錯誤";}// 處理其他業務邏輯return "登錄成功";

但是,你有沒有想過,如果不用if-else,而是用異常來控制流程,會怎樣呢?3sn28資訊網——每日最新資訊28at.com

比如,你的登錄方法里,驗證碼不正確,不是返回一個錯誤信息,而是“砰”地一聲拋出個異常。3sn28資訊網——每日最新資訊28at.com

// 偽代碼if (驗證碼 != 8888) {    throw new ServiceException("驗證碼錯誤");}// 處理其他業務邏輯return "登錄成功";

聽起來是不是有點瘋狂?但這就是自定義異常的魅力所在,它能讓你的代碼看起來像是在演電影,每個異常都是一個劇情轉折。3sn28資訊網——每日最新資訊28at.com

這里封裝了一個業務類異常類ServiceException,該異常類繼承了運行時異常RuntimeException:3sn28資訊網——每日最新資訊28at.com

/** * 服務異常,可用于控制業務異常流程,拋出后由統一異常增強類捕獲,返回友好提示 * * @author Jensen * @公眾號 架構師修行錄 */@Datapublic class ServiceException extends RuntimeException {    protected Integer code;    public ServiceException(Integer code, String message) {        super(message);        this.code = code;    }    public ServiceException() {        this(500, "請求成功但是服務異常");    }    public ServiceException(String message) {        this(500, message);    }    public ServiceException(Throwable e) {        this(e.getMessage());    }}

使用自定義異常來代替傳統的if-else語句進行錯誤處理和流程控制,有其優缺點:3sn28資訊網——每日最新資訊28at.com

優點:3sn28資訊網——每日最新資訊28at.com

  • 提高代碼可讀性:自定義異??梢宰屇愀逦乇磉_錯誤情況,使得代碼的意圖更容易理解。
  • 集中錯誤處理:通過拋出和捕獲異常,你可以將錯誤處理邏輯集中到特定的位置,而不是分散在代碼的多個地方。
  • 易于維護:當需要修改或擴展錯誤處理邏輯時,使用異常機制可以更容易地進行維護和升級。
  • 支持多路選擇:在某些情況下,異??梢杂糜趯崿F多路選擇結構,通過不同的異常類型來區分不同的執行路徑。
  • 資源管理:異常處理機制通常與資源管理(如文件關閉、數據庫連接釋放等)結合使用,確保資源在使用完畢后得到正確釋放。

缺點:3sn28資訊網——每日最新資訊28at.com

  • 性能開銷:異常處理通常比條件判斷要慢,因為它涉及到棧展開和異常對象的創建。
  • 濫用風險:異常機制有時會被濫用,例如用于正常的流程控制,這可能會導致性能問題和難以理解的代碼。
  • 調試困難:異常可能會使調試變得更加困難,特別是在復雜的異常傳播和處理過程中。
  • 異常類型管理:隨著項目的發展,可能會有大量的自定義異常類型,管理這些異常類型并確保它們的適當使用可能會變得復雜。
  • 語言特性依賴:使用異常處理可能依賴于特定的編程語言特性,這可能會限制代碼的移植性。

總的來說,自定義異常在處理錯誤和異常情況時提供了一種強大而靈活的機制,我覺得可以使用,但不能濫用,常規的還是要使用if-else控制,涉及API的中斷流程可以快速跳出內部,并且R對象可無須傳遞進Service層。3sn28資訊網——每日最新資訊28at.com

二、全局異常捕獲

想象一下,你的業務代碼里拋出了一大堆異常,你總不能把這些異常原封不動地扔給API的使用者吧。3sn28資訊網——每日最新資訊28at.com

這時候,@RestControllerAdvice就像是那個超級英雄,跳出來拯救世界,把所有的異常都捕獲起來,然后優雅地包裝成一個個友好的響應。3sn28資訊網——每日最新資訊28at.com

@RestControllerAdvice 是 Spring MVC 中的一個注解,用于定義一個全局的異常處理類,該類可以捕獲和處理 Spring 應用中發生的特定類型的異常。這個注解通常與 @ExceptionHandler 注解一起使用,來定義處理特定異常的方法。3sn28資訊網——每日最新資訊28at.com

@RestControllerAdvice 的主要作用和特點包括:3sn28資訊網——每日最新資訊28at.com

  • 全局異常處理:通過在類上使用 @RestControllerAdvice 注解,你可以定義一個類來全局處理控制器(Controller)中拋出的異常。
  • 減少重復代碼:你不需要在每個控制器中編寫相同的異常處理邏輯。通過定義一個全局的異常處理類,可以統一處理特定類型的異常,從而減少代碼重復。
  • 自定義錯誤響應:可以自定義異常的響應格式,例如返回 JSON 對象,包含錯誤信息、狀態碼等,以提供更友好的錯誤提示給前端。
  • 支持多控制器:一個 @RestControllerAdvice 類可以為多個控制器提供異常處理支持,無論這些控制器是否位于同一個包路徑下。
  • 組合使用:可以定義多個 @RestControllerAdvice 類,并通過 basePackages 或 basePackageClasses 屬性來指定它們所影響的控制器包路徑。
  • 支持繼承:如果多個控制器有相似的異常處理需求,可以通過繼承一個基礎的異常處理類來實現代碼復用。

捕獲業務異常ServiceException后,封裝R對象返回給接口調用方:3sn28資訊網——每日最新資訊28at.com

@RestControllerAdvicepublic class GlobalRestExceptionAdvice {    @ExceptionHandler({ServiceException.class})    public R<Map<String, String>> serviceException(HttpServletRequest request, ServiceException e) {        return R.fail(e.getCode(), e.getMessage(), null);    }}

到這里,我們就可以通過拋出ServiceException來實現異常流程的控制了,并且方法上注解了@Transactional實現的事務控制,在拋出異常后也是能正?;貪L的。3sn28資訊網——每日最新資訊28at.com

三、封裝使用業務斷言

在Java中,斷言就像是那個總是在后臺默默支持你的好朋友,它在開發和測試階段幫你檢查那些邏輯錯誤。3sn28資訊網——每日最新資訊28at.com

但是,別忘了,它也是有脾氣的,一旦到了生產環境,它就罷工了。所以,記得在需要的時候啟用它,不需要的時候,就讓它好好休息。3sn28資訊網——每日最新資訊28at.com

assert condition : "This is an error message.";

斷言的特點:3sn28資訊網——每日最新資訊28at.com

  • 條件檢查:斷言用于檢查程序的預期條件,如果條件不滿足,則拋出異常。
  • 調試時有用:斷言在開發和測試階段非常有用,可以幫助開發者快速定位問題。
  • 性能考慮:由于斷言可能會影響程序性能,因此在生產環境中通常不啟用斷言。
  • 非正式錯誤處理:斷言不是錯誤處理的一部分,它不適用于處理那些預期會發生的情況。

使用斷言的注意事項:3sn28資訊網——每日最新資訊28at.com

  • 性能影響:斷言會增加額外的性能開銷,因為每次斷言都會計算布爾表達式的值。
  • 生產環境:在生產環境中,斷言應該被禁用,以避免不必要的性能損耗。
  • 異常處理:斷言拋出的是 AssertionError,這是一種特殊的 Error,通常不應該被應用程序捕獲或處理。

斷言是Java語言的一個特性,它的使用應該謹慎,主要限于開發和測試階段,以確保生產環境中的程序性能和穩定性。3sn28資訊網——每日最新資訊28at.com

我們借鑒斷言這種設計思想,針對業務異常進一步封裝,形成 “業務斷言”,主要目標只有一個:3sn28資訊網——每日最新資訊28at.com

管理我們對代碼的期望。3sn28資訊網——每日最新資訊28at.com

先定義一個業務斷言工具類BizAssert:3sn28資訊網——每日最新資訊28at.com

/** * 業務斷言類,斷言不通過將拋出ServiceException */@UtilityClasspublic class BizAssert {      public <T> T notNull(T dontNull) {        if (dontNull == null) {            throw new ServiceException("this object must not be null");        }        return dontNull;    }    public void notBlank(String dontBlank) {        if (dontBlank == null || dontBlank.length() == 0) {            throw new ServiceException("this string must not be null or blank");        }    }    public <E, T extends Iterable<E>> T notEmpty(T dontEmpty) {        if (dontEmpty == null || !dontEmpty.iterator().hasNext()) {            throw new ServiceException("this collection must not be null or empty");        }        return dontEmpty;    }    public <T> T isOk(IR r) {        if (r == null || !r.isOk()) {            throw new ServiceException(r == null ? "this result must not be null" : r.getMsg());        }        return r.getData();    }    public <T> T notNull(IR r) {        if (r == null || !r.isOk() || r.getData() == null) {            throw new ServiceException(r == null ? "this result must not be null" : r.getMsg());        }        return r.getData();    }}

使用業務斷言:3sn28資訊網——每日最新資訊28at.com

// 從數據庫中查詢出用戶User user = UserQuery.builder().id(userId).build().getOne();// 業務斷言,我希望查出來的用戶不能為null,否則后續業務會報錯BizAssert.notNull(user);// 其他針對user的業務處理邏輯Map<String, String> data = new HashMap<>();data.put("girl-friend", user.getName());

四、寫在最后

上述提到的業務斷言方法,僅展示了其中一部分,除了簡單的判斷,我們還可以加上日期比較、數值大小比較、equals比較、集合的contains方法等等,我把它的完整版集成到了我的D3Boot開源基礎框架內,大家需要可以移步Gitee抄作業。

Gitee源碼地址:3sn28資訊網——每日最新資訊28at.com

https://gitee.com/jensvn/d3boot(例行賒Star)3sn28資訊網——每日最新資訊28at.com

D3boot基礎框架具體的使用方式見源碼的README.md文件,這里不再贅述。3sn28資訊網——每日最新資訊28at.com

能寫一行代碼的事,絕不寫3行5行,適度封裝,讓代碼更優雅!3sn28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-85874-0.html一種避免大量If-else代碼的新思路

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Node.js 重大更新,你知道更新了啥?

下一篇: 一篇學會SpringBoot的核心內容之自動裝配

標簽:
  • 熱門焦點
  • 直屏旗艦來了 iQOO 12和K70 Pro同臺競技

    旗艦機基本上使用的都是雙曲面屏幕,這就讓很多喜歡直屏的愛好者在苦等一款直屏旗艦,這次,你們等到了。據博主數碼閑聊站帶來的最新爆料稱,Redmi下代旗艦K70 Pro和iQOO 12兩款手
  • 讓我們一起聊聊文件的操作

    文件【1】文件是什么?文件是保存數據的地方,是數據源的一種,比如大家經常使用的word文檔、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存數據,它既可以保
  • 零售大模型“干中學”,攀爬數字化珠峰

    文/侯煜編輯/cc來源/華爾街科技眼對于絕大多數登山愛好者而言,攀爬珠穆朗瑪峰可謂終極目標。攀登珠峰的商業路線有兩條,一是尼泊爾境內的南坡路線,一是中國境內的北坡路線。相
  • 本地生活這塊肥肉,拼多多也想吃一口

    出品/壹覽商業 作者/李彥編輯/木魚拼多多也看上本地生活這塊蛋糕了。近期,拼多多在App首頁&ldquo;充值中心&rdquo;入口上線了本機生活界面。壹覽商業發現,該界面目前主要
  • 猿輔導與新東方的兩種“歸途”

    作者|卓心月 出品|零態LT(ID:LingTai_LT)如何成為一家偉大企業?答案一定是對&ldquo;勢&rdquo;的把握,這其中最關鍵的當屬對企業戰略的制定,且能夠站在未來看現在,即使這其中的
  • 東方甄選單飛:有些鳥注定是關不住的

    文/彭寬鴻編輯/羅卿東方甄選創始人俞敏洪帶隊的&ldquo;7天甘肅行&rdquo;直播活動已在近日順利收官。成立后一年多時間里,東方甄選要脫離抖音自立門戶的傳聞不絕于耳,&ldquo;7
  • 攜眾多高端產品亮相ChinaJoy,小米帶來一場科技與人文的視聽盛宴

    7月28日,全球數字娛樂領域最具知名度與影響力的年度盛會中國國際數碼互動娛樂展覽會(簡稱ChinaJoy)在上海新國際博覽中心盛大開幕。作為全球領先的科
  • 網傳小米汽車開始篩選交付中心 建筑面積不低于3000平方米

    7月7日消息,近日有微博網友@長三角行健者爆料稱,據經銷商集團反饋,小米汽車目前已經開始了交付中心的篩選工作,要求候選場地至少有120個車位,建筑不能低
  • 引領旗艦級影像能力向中端機普及 OPPO K11 系列發布 1799 元起

    7月25日,OPPO正式發布K系列新品—— OPPO K11 。此次 K11 在中端手機市場長期被忽視的影像板塊發力,突破性地搭載索尼 IMX890 旗艦大底主攝,支持 OIS
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美一区二区在线看| 欲色影视综合吧| 欧美日韩在线亚洲一区蜜芽| 欧美三级特黄| 国产精品视频1区| 国产一区清纯| 亚洲三级观看| 99亚洲伊人久久精品影院红桃| 中日韩午夜理伦电影免费| 欧美在线三区| 欧美黑人国产人伦爽爽爽| 国产精品美女一区二区| 韩国av一区二区三区| 亚洲精品五月天| 亚洲欧美日本视频在线观看| 久久资源在线| 国产精品第一页第二页第三页| 国产一区在线看| 亚洲美女黄色| 久久经典综合| 欧美日韩在线一区二区三区| 国内精品久久久久久久97牛牛| 日韩视频二区| 久久gogo国模裸体人体| 欧美日韩成人一区| 国内视频精品| 亚洲永久免费观看| 欧美顶级少妇做爰| 国产一区二区三区久久| 夜夜夜精品看看| 久久综合伊人77777蜜臀| 国产精品毛片大码女人| 亚洲日本在线观看| 久久精品在线| 国产精品日韩欧美一区| 亚洲精品免费一区二区三区| 久久精品国产精品亚洲精品| 欧美视频一区二| 亚洲高清视频在线| 欧美在线观看网站| 国产精品porn| 亚洲精品影视在线观看| 久久中文字幕导航| 国产日本欧美一区二区三区| 一片黄亚洲嫩模| 欧美韩日精品| 激情婷婷欧美| 午夜伦欧美伦电影理论片| 欧美日韩精品综合在线| 亚洲国产精品一区制服丝袜| 久久久久久久999| 国产精品中文在线| 在线中文字幕一区| 亚洲一区久久| 久久久精品免费视频| 欧美91精品| 国产一区二区三区的电影| 国产精品影音先锋| 久久久午夜精品| 日韩网站在线| 蜜桃av噜噜一区| 中日韩高清电影网| 欧美久久一区| 夜夜精品视频一区二区| 国产精自产拍久久久久久蜜| 欧美体内she精视频在线观看| 亚洲综合色丁香婷婷六月图片| 亚洲欧洲美洲综合色网| 国产主播喷水一区二区| 欧美午夜电影一区| 麻豆精品精华液| 亚洲一区日韩在线| 国产精品九九久久久久久久| 女人天堂亚洲aⅴ在线观看| 蜜桃久久精品乱码一区二区| 久久精品人人做人人综合| 日韩一区二区精品视频| 午夜一区二区三视频在线观看 | 久久精品亚洲乱码伦伦中文| 久久国产福利| 久久狠狠久久综合桃花| 欧美成人免费大片| 欧美午夜一区二区| 国产亚洲视频在线观看| 狠狠久久亚洲欧美| 亚洲美女黄色片| 一本色道久久综合亚洲精品小说| 久久精品国产91精品亚洲| 欧美精品在线视频观看| 亚洲精品男同| 欧美连裤袜在线视频| 日韩天堂av| 欧美日韩免费| 一本色道久久综合亚洲精品高清| 欧美日韩视频在线第一区| 亚洲五月婷婷| 国产欧美另类| 久久久99国产精品免费| 1769国产精品| 欧美精品 国产精品| 妖精成人www高清在线观看| 欧美视频久久| 午夜久久电影网| 一区二区三区在线高清| 男人的天堂成人在线| 亚洲另类一区二区| 国产精品久久久久久av下载红粉| 午夜精品久久久久久99热| 国产在线一区二区三区四区 | 另类春色校园亚洲| 亚洲欧洲另类国产综合| 欧美午夜精品久久久久久人妖| 亚洲欧美国产77777| 国产在线不卡视频| 麻豆精品精华液| 亚洲少妇诱惑| 国产在线高清精品| 免费观看成人| 亚洲天堂av电影| 国模吧视频一区| 欧美区一区二区三区| 午夜精品久久久久久久男人的天堂| 国内精品久久久久久影视8 | 国产日本欧美一区二区三区在线| 久久久另类综合| 亚洲最新合集| 国产在线成人| 欧美日韩视频专区在线播放| 欧美一区二区三区男人的天堂| 亚洲国产成人不卡| 国产精品美女久久久免费| 免费久久久一本精品久久区| 亚洲一区二区三区精品动漫| 黄色精品在线看| 欧美午夜不卡视频| 久热国产精品| 亚洲私拍自拍| 亚洲电影免费观看高清完整版在线| 欧美日韩中文另类| 久久久久久亚洲综合影院红桃 | 欧美成人精品在线播放| 亚洲专区免费| 亚洲国产一区二区三区青草影视| 国产精品久久久久国产精品日日| 鲁鲁狠狠狠7777一区二区| 亚洲一区二区高清视频| 18成人免费观看视频| 国产精品女人毛片| 欧美高清一区二区| 久久精品国产亚洲高清剧情介绍 | 牛人盗摄一区二区三区视频| 亚洲欧美成人精品| 亚洲人成在线影院| 国产一区二区三区在线观看视频| 欧美日韩国产成人在线91| 久久青青草原一区二区| 午夜电影亚洲| 亚洲另类自拍| 一区二区在线视频| 国产精品综合不卡av| 欧美日韩国产在线播放网站| 乱中年女人伦av一区二区| 羞羞漫画18久久大片| 一区二区三区免费观看| 亚洲国产专区| 狠狠色狠狠色综合日日小说| 国产精品腿扒开做爽爽爽挤奶网站| 欧美精品综合| 免费成人av| 久久综合久色欧美综合狠狠| 久久av资源网站| 亚洲欧美自拍偷拍| 中文日韩在线视频| 日韩一区二区电影网| 亚洲国产一区二区三区a毛片| 狠狠综合久久av一区二区小说| 国产精品欧美经典| 欧美日韩综合视频网址| 欧美精品v国产精品v日韩精品| 久久婷婷色综合| 久久精品国产清高在天天线 | 久久精品国产亚洲aⅴ| 午夜欧美电影在线观看| 中文av一区特黄| a4yy欧美一区二区三区| 亚洲精品专区| 亚洲精品乱码久久久久久蜜桃麻豆 | 欧美日韩在线不卡一区| 欧美激情 亚洲a∨综合| 免费欧美电影| 久久综合色播五月| 久久久久久久久岛国免费| 久久精品国产99| 久久大逼视频| 久久精品女人| 久久精品国产免费观看| 久久成人免费日本黄色| 欧美制服丝袜| 久久精品国产精品亚洲精品| 久久精品女人的天堂av| 久久九九精品99国产精品| 久久久久一区| 老司机精品福利视频| 免费欧美视频|