天天看點

阿裡P8面試:微服務項目如何校驗參數(上)1 參數校驗的意義2 最佳實踐

1 參數校驗的意義

大多數方法對傳遞給它們的參數值有限制。例如,索引值必須非負,對象引用必須非空。

應該清楚地在文檔中記錄所有這些限制,并在方法主體的開頭使用檢查來實施它們。

應該在錯誤發生後盡快找到它們,這是一般原則。如果不這樣做,就不太可能檢測到錯誤,而且即使檢測到錯誤,确定錯誤的來源也很難。

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

若該方法在執行前檢查參數,這過程将迅速失敗,并引發異常

若方法未檢查參數,可能會在處理過程中出現:

莫名其妙的異常而失敗

正常傳回,但會悄悄計算錯誤結果

正常傳回,但會使某對象處于隐患狀态,可能在未來某不确定時間在某不相關代碼點報錯。

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

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

看案例:

阿裡P8面試:微服務項目如何校驗參數(上)1 參數校驗的意義2 最佳實踐

文檔注釋并沒說「若 m 為空,mod 将抛NPE」,盡管方法确實這麼做了,作為調用 m.signum() 的副産物。該異常記錄在外圍 BigInterger 類級别的文檔注釋。類級别注釋适用于類的所有public方法中的所有參數。這可以避免在每個方法上分别記錄每個 NullPointerException 而造成混亂。

它可與 @Nullable 或類似注解結合使用,以訓示某特定參數可能為 null,但這種做法并不标準,而且使用了多個注解。

2 最佳實踐

Java 7 提供

Objects.requireNonNull

不再需手動執行空檢查。

阿裡P8面試:微服務項目如何校驗參數(上)1 參數校驗的意義2 最佳實踐

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

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

也可以忽略傳回值并使用 

Objects.requireNonNull

 作為一個獨立判空方法。