成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

阿里Java架構師教你寫代碼-如何校驗參數?

開發 前端
本篇教你寫代碼-如何校驗參數?理解參數校驗的意義和運用。

[[348391]]

 1 參數校驗的意義

 

大多數方法會限制傳遞給它們的參數值。常見的比如,索引值非負,引用非空。作為優雅的開發者,應做到:

  1. 在Java Doc中清楚地記錄這些限制,并在方法體開頭校驗
  2. 在錯誤發生后盡快找到。若不這樣做,就不太可能檢測到錯誤,而且即使檢測到錯誤,確定其源頭也很難

若一個無效參數被傳遞給一個方法,若該方法

  1. 校驗參數,方法將迅速失敗,并拋異常
  2. 未校驗參數,可能會在方法執行過程中發生如下情形:
  • 莫名其妙的異常而失敗
  • 正常返回,但會暗中計算錯誤結果
  • 正常返回,但會使某對象處于隱患狀態,可能在未來某不確定時間在某不相關代碼點報錯。

總之,若不校驗參數,可能會違反失敗原子性。

對public、protected方法,要在方法說明使用 Javadoc 的 @throws 標簽說明,若違反參數值限制時會拋出的異常。通常為 IllegalArgumentException、IndexOutOfBoundsException 或 NullPointerException。一旦在文檔中記錄了參數限制,并且記錄違反這些限制將引發的異常,強加這些限制就很簡單了。

看案例:

文檔注釋并沒說「若 m 為空,mod 將拋NPE」,然而方法確實做了,只是作為調用 m.signum() 的副產物。該異常記錄在外圍 BigInterger 類級別的文檔注釋。類級別注釋適用于類的所有public方法中的所有參數??梢员苊庠诿總€方法上分別記錄每個 NullPointerException 而造成雜糅。
可與 @Nullable 或類似注解協作,指示某參數可能為 null,但這種做法并非標準,而且使用了多個注解。

2 最佳實踐

 

Java 7 提供 Objects.requireNonNull 不再需手動執行空檢查。

如果愿意,還可自定義異常詳情。該方法返回其輸入,所以使用一個值的同時可執行判空:

  1. // Java 內置的判空功能 
  2. this.strategy = Objects.requireNonNull(strategy, "strategy"); 

也可以忽略返回值并使用 Objects.requireNonNull 作為一個獨立判空方法。

3 邊界檢查

 

在 Java 9 中,邊界檢查功能被添加到 java.util.Objects。該功能由三個方法組成:

checkFromIndexSize

checkFromToIndex

checkIndex

該套工具不如判空方法靈活。它不允許自定義異常詳細信息,僅適用于 List 和數組索引,且不處理封閉范圍(包含兩個端點)。

4 斷言

 

對于未暴露的方法,作為包開發者,你應該控制方法在何時能被調用,因此你可以并且也應該確保只傳入有效參數值。因此,非public方法可使用斷言檢查入參:

 

從本質上說,這些斷言是在聲稱被斷言的條件為 true,而不管客戶端如何調用。與普通校驗不同的是:

 

  • 若斷言失敗,會拋 AssertionError
  • 若斷言沒有作用,本質上不存在成本,除非通過將 -ea或 -enableassertion標識傳遞給 java 命令來啟用它們

 

 

靜態工廠方法

 

尤其應檢查那些尚未由方法調用,而是存起供日后使用的參數的有效性。例如靜態工廠方法,它接受 int 數組并返回數組的 List 視圖。若客戶端傳入 null,將拋 NullPointerException,因為該方法具有顯式檢查(調用 Objects.requireNonNull)。如果省略檢查,該將返回對新創建的 List 實例的引用,該實例將在客戶端試圖使用它時拋出 NullPointerException。到那時,List 實例的起源很難確定,使調試變得復雜。
構造器就是一種特殊情況。務必檢查構造器入參有效性,避免構造生成實例對象時,違背對象的不變性。

 

例外

 

在執行方法前,應顯式檢查參數,也有例外 - 有效性檢查成本較高或不切實際,或檢查在計算過程中隱式執行了。
例如,一個為對象 List 排序的方法,比如 Collections.sort(List)。List 中的所有對象必須相互比較。在對 List 排序的過程中,List 中的每個對象都會與列表中的其他對象進行比較。如果對象不能相互比較,將拋出 ClassCastException,這正是 sort 方法應該做的。因此,沒有必要預先檢查列表中的元素是否具有可比性。但不加區別地依賴隱式有效性檢查可能導致失敗原子性的丟失。

有時,計算任務會隱式地執行所需的有效性檢查,但如果檢查失敗,則拋出錯誤的異常。即計算任務由于無效參數值所拋異常,與文檔中記錄的方法要拋出的異常不匹配。此時應該使用異常轉換將計算任務拋出的異常轉換為正確的異常。

5 總結

 

請勿從本文自以為對參數的限制永遠都是好事。我們追求的是通用又實用的方法設計。若該方法可對它所接受的所有參數值進行合理的處理,那么對參數所加限制越少越好。

建議你每次編寫方法前,考慮清楚參數存在哪些限制。在文檔中記錄這些限制并在方法主體的開頭顯式檢查。養成這樣的習慣!這一少量工作將在校驗出現失敗時給你一片春光!

參考

《阿里 Java 開發手冊》

《重構》

《Effective Java》

 

責任編輯:姜華 來源: JavaEdge
相關推薦

2019-02-22 10:00:45

Java開發代碼

2016-12-22 23:55:40

架構師代碼技術

2020-10-26 11:41:47

kill代碼

2020-11-03 09:10:18

JUC-Future

2021-02-01 07:40:55

架構師阿里技專家

2019-07-22 22:22:02

架構運維技術

2020-06-28 08:34:07

架構師阿里軟件

2020-01-16 15:35:00

高并發架構服務器

2019-07-31 07:36:12

架構運維技術

2019-10-31 09:52:03

Android代碼規范

2019-08-22 10:54:05

分布式系統架構

2009-02-26 16:32:58

SaaS開發SaaS應用Open API

2011-04-07 16:20:24

軟件架構師架構師架構

2021-06-07 09:35:11

架構運維技術

2020-07-21 08:00:44

架構師BAT線程

2018-07-03 15:46:24

Java架構師源碼

2015-08-12 10:10:44

2017-09-16 18:29:00

代碼數據庫線程

2021-02-25 11:30:17

代碼開發技術

2012-08-04 16:02:00

架構師
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91av在线电影| 男人天堂网址 | 亚洲精品视频一区二区三区 | 欧美不卡 | 精品国产一区二区国模嫣然 | 综合二区 | 亚洲在线视频 | 国产一级影片 | 国产乱码久久久 | 国产在线一区二区三区 | 久久午夜影院 | 日韩成人精品一区二区三区 | 一区欧美 | 久久99精品国产麻豆婷婷 | 精品免费国产视频 | 亚洲日本一区二区 | 国产视频精品在线观看 | 九九在线 | 国产ts人妖系列高潮 | 日本精品视频 | 欧美激情欧美激情在线五月 | 成人影院av| 丁香婷婷在线视频 | 在线中文字幕第一页 | 亚洲性在线 | 国产片侵犯亲女视频播放 | 欧美九九| 欧美二三区| 国产96色在线 | 人操人免费视频 | 久久久不卡网国产精品一区 | 在线观看国产www | 色爱综合网| 日日噜噜噜夜夜爽爽狠狠视频, | 国产精品毛片一区二区三区 | 真人女人一级毛片免费播放 | 日韩成人在线播放 | 午夜欧美一区二区三区在线播放 | 久久夜色精品国产 | 国产精品国产精品国产专区不卡 | 欧美久久久久 |