1

當你寫一個方法時,比如在你的一個DAO對象中,並且你不希望這個方法接受某些輸入,爲了討論的緣故,說它不允許null參數。你如何去實現這一點,考慮到這種方法將來可能會被新的團隊成員重用。在Java中處理未接受方法參數的最佳方法是什麼?

我做到這一點的方法是:

  1. 在接口方面,我是一個變量,b和c不能爲空的方法的javadoc裏面的文件。
  2. 在方法內部,我檢查空值的第一件事情,如果任何a,b或c都爲null,那麼我拋出一個IllegalArgumentException。

但是,如果某些未來的開發人員只是讀取方法簽名並決定他/她需要什麼並開始使用它,而沒有關注這些細節,並且更糟糕的測試不會揭示它。 NULL指針異常不會發生,並且我們正在收到一條有用的錯誤消息,但是我們仍然在生產中遇到了可能已被避免的錯誤。

有沒有辦法在編譯時強制執行?我對此表示懷疑,但如何做到這一點最安全和最不利於開發者的方式呢?

回答

4

我不認爲你可以強制這個編譯時間,但你當然可以使方法簽名容易理解。

如果您不是我的驗證框架之一添加依賴項,您可以使用JSR 303@NotNull或類似的工具,如Preconditions

有了JSR 303,你可以做SUFF,如:

@NotNull 
@Size(min = 2, max = 14) 
@UpperCase 
private String licensePlate; 

@NotNull 
@NotEmpty 
public String foo(@NotNull @Pattern(regexp="[0-9]") String param) { 
    ... 
} 

看一看的Getting started with JSR 303 Bean Validation更全面的例子。

+0

非常酷,我會說,有沒有回答這個問題。但是,您的答案應該不僅僅包含一個鏈接。在Stackoverflow上,我們努力提供將持續多年的內容。如果你的鏈接被破壞了,那麼解釋也是如此。你能編輯你的答案來解釋這是什麼嗎? – jmort253 2012-03-03 10:29:01

+0

根據@ jmort253的要求添加示例 – ebaxt 2012-03-03 10:50:23

+0

+1 - 非常有幫助! – jmort253 2012-03-03 10:56:04

0
  1. 儘可能在編譯時強制執行的東西是通過拋出檢查異常,這會強制調用者在編譯時處理異常。這可能會讓他們閱讀文檔。 IllegalArgumentException未經檢查,可能會被忽視。

  2. 保護無法使用的值的正常做法是返回到指定的東西不可用並添加顯示錯誤消息。這將防止在該方法繼續執行時可能發生的生產異常,但可能不會完全避免。

1

您可以使用靜態代碼檢查工具如findbugs jsr305在提交/發佈前檢查它。

public String method(@NonNull String parameter){ 
    ... 
} 

findbugs manual on annotation

相關問題