2016-10-19 44 views

回答

4

區別在於規範和實現之間。 @NonNull給出了例程的說明,Preconditions.checkNotNull()給出了驗證例程的一種方法。

@NonNull在形式參數上指定一個契約:永遠不應該用null作爲相應的實際參數調用該方法。

有多種方法來驗證這樣的規範。

  • 您可以執行運行時與assert陳述或者等價地,Preconditions.checkNotNull()檢查。這會在運行時動態地發現違反合同的情況,並使程序崩潰。這通過提供更早的警告消息使代碼更易於調試,但不會提高代碼質量。

  • 您可以在編譯時使用IDE或其他工具執行靜態檢查。如果您使用聲音工具,則可以保證不會有可能的執行違反規範並導致程序崩潰。

您需要規定您的方法以記錄應該如何使用它。你不妨寫下使用@NonNull註釋而不是英文作爲Javadoc,因爲@NonNull是簡潔和機器可讀的。所以,你應該寫@NonNull註釋。

這是可選的,但有用的,以驗證您的規範的正確性。使用運行時檢查和靜態檢查進行驗證是一種腰帶式和吊帶式的方法。它使用兩種不同的技術來驗證規範。如果使用FindBugs等不穩定的靜態檢查工具,那麼執行運行時檢查是一個不錯的主意,因爲即使FindBugs沒有發出任何警告,代碼中仍可能出現空值錯誤。如果您使用Checker FrameworkNullness Checker等聲音工具,則運行時檢查是無關緊要的。不過,它們並沒有太大的傷害:只是一點點的代碼混亂和一點點的運行時間開銷。 (請注意,如果將空值作爲參數傳遞,規範可能要求引發特定異常,這將要求方法體包含代碼,例如Preconditions.checkNotNull(),即使您已經證明了這一點你的程序永遠不會傳遞null,一個規定拋出確切異常的規範對於客戶端代碼並不是特別有用,客戶端真的只想知道在哪種情況下調用會成功,並且客戶端不可能專門爲其提供catchNullPointerException因此,規範中客戶需要的主要信息是空值是非法值。)

相關問題