在拥有数万个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构造函数中使用)吗?
我找到的几个教程/博客处理方法签名中的参数验证,而不是传递给方法的值。
或者有更优雅的工具可用吗?
像Checker Framework这样的编译时工具可以验证方法或构造函数的参数。您注释参数类型以指示允许的值,然后当javac
运行时,如果参数可能与参数不兼容,它会发出警告。
如果可能的值数量有限,那么您可以使用假枚举检查器将字符串或整数视为枚举值。(使用Javaenum
也是一个好主意,但可能不可能或不方便,因为其他代码需要字符串或整数。)
如果可能值的数量是无限的,那么您可以使用常量值检查器——例如,提供一个正则表达式,任何常量字符串参数都必须满足。
你也可以定义你自己的编译时验证,如果你想要不同于与检查器框架一起分发的检查器中可用的功能。