在一個包含數萬個 Java 檔案的大型專案中,有幾個 Java 類,開發人員可以在其中將字串作為引數傳遞給我實作的建構式類
public byte[] getProductReport(List<String> products, Date from, Date to) {
// ... do some stuff before...
List<ReportParameterDto> reportParameters = new ArrayList<>();
reportParameters.add(new ReportParameterDto("From (YYYY.MM.DD)", ParameterType.DATE, from));
reportParameters.add(new ReportParameterDto("To_(YYYY.MM.DD)", ParameterType.DATE, to));
reportParameters.add(new ReportParameterDto("Products", ParameterType.SELECT, someList));
return ReportFromCRServerHelper.downloadReport("ProductReporot", reportParameters, ReportFormat.PDF);
}
如果開發人員使用錯誤的字串值下載請求的報告(從遠程報告服務器)將在運行時失敗。
在此示例中,我希望在編譯期間進行一些驗證檢查,以便在客戶發現這些錯誤之前避免這些錯誤。
我有 API 方法可以從報告中獲取引數值,我希望在編譯上述方法期間使用這些方法。
在我的示例中,編譯應該失敗并拋出一個錯誤,突出顯示引數的外觀:
"From (JJJJ-MM)" is invalid --> should be "From_(JJJJ-MM)"
"Products" is invalid --> should be "PRODUCT_LIST"
我可以通過 JAVAX 注釋處理來檢測這些引數(在上面的 ReportParameterDto 建構式中使用)嗎?
我發現的少數教程/博客涉及驗證方法簽名中的引數,而不是傳遞給方法的值。
還是有更優雅的工具可用?
uj5u.com熱心網友回復:
像Checker Framework這樣的編譯時工具可以驗證方法或建構式的引數。您注釋引數型別以指示允許的值,然后在javac運行時如果引數可能與引數不兼容,它會發出警告。
如果可能的值數量有限,則可以使用Fake Enum Checker將字串或整數視為列舉值。(使用 Javaenum也是一個好主意,但可能不可行或不方便,因為其他代碼需要字串或整數。)
如果可能值的數量不受限制,那么您可以使用常量值檢查器——例如,提供任何常量字串引數都必須滿足的正則運算式。
如果您想要與隨 Checker Framework 一起分發的檢查器中提供的功能不同的功能,您還可以定義自己的編譯時驗證。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/475167.html
