日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
阿里Java架構(gòu)師教你寫代碼-如何校驗參數(shù)?

 1 參數(shù)校驗的意義

成都創(chuàng)新互聯(lián)公司服務(wù)項目包括措勤網(wǎng)站建設(shè)、措勤網(wǎng)站制作、措勤網(wǎng)頁制作以及措勤網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,措勤網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到措勤省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

大多數(shù)方法會限制傳遞給它們的參數(shù)值。常見的比如,索引值非負(fù),引用非空。作為優(yōu)雅的開發(fā)者,應(yīng)做到:

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

若一個無效參數(shù)被傳遞給一個方法,若該方法

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

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

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

看案例:

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

2 最佳實踐

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

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

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

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

3 邊界檢查

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

checkFromIndexSize

checkFromToIndex

checkIndex

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

4 斷言

對于未暴露的方法,作為包開發(fā)者,你應(yīng)該控制方法在何時能被調(diào)用,因此你可以并且也應(yīng)該確保只傳入有效參數(shù)值。因此,非public方法可使用斷言檢查入?yún)ⅲ?/p>

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

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

靜態(tài)工廠方法

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

例外

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

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

5 總結(jié)

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

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

參考

《阿里 Java 開發(fā)手冊》

《重構(gòu)》

《Effective Java》


本文標(biāo)題:阿里Java架構(gòu)師教你寫代碼-如何校驗參數(shù)?
網(wǎng)頁地址:http://www.5511xx.com/article/dppsdso.html