Error Prone Support引入了新的错误检查和 Refaster 模板
“supermarket on wheels”公司 Picnic发布了Error Prone Support,这是一个开源项目,它扩展了 Google 的Error Prone,其中包含三十个新的错误检查,用于检测并选择性地解决 Java 项目编译期间可能出现的错误。超过五十个新的 Refaster 规则集合可用于通过自动重写代码库来提高代码一致性。
Error Prone 是一个 Java 编译器插件,由 Google 开源,它在编译期间执行静态分析以检测错误或提出可能的改进建议。该插件包含 500 多个预定义错误检查,并允许第三方和自定义插件。检测到问题后,Error Prone 可以显示警告或使用预定义的解决方案自动更改代码。
最近发布的Error Prone Support提供的三十个新错误检查之一是类,错误检查将显示警告或可选择删除以下方法:EmptyMethod
void method() {}
static void staticMethod() {}
每当需要空方法时,可以使用以下注释抑制误报:
@SuppressWarnings("EmptyMethod")
只要一个类只有一个构造函数,AutowiredConstructor
错误检查就会删除冗余@Autowired
注释,如下例所示:
class Course {
@Autowired
Course() {}
}
class Student {
@Autowired
Student(String name) {}
}
该类MethodReferenceUsage
检测 lambda 表达式并将它们转换为方法引用。例如,() -> course.method()
更改为course::method
。
在 Error Prone 中编写错误检查涉及使用抽象语法树(AST) 和 Error Prone 的 API。这通常是检测错误所必需的,但在重写代码时通常不需要。Google 的Refaster更易于使用,现在是 Error Prone 的一部分。Refaster 规则可用于在 Java 中使用@BeforeTemplate
和@AfterTemplate
注释定义重写规则。Error Prone Support 提供了五十多个新的 Refaster 规则集合,其中包含 500 多个 Refaster 模板,例如StringRules
类,它用方法替换各种表达式来评估 a 是否String
为空String.isEmpty()
:
@BeforeTemplate
boolean before(String str) {
return Refaster.anyOf(str.length() == 0, str.length() <= 0,
str.length() < 1);
}
@AfterTemplate
@AlsoNegation
boolean after(String str) {
return str.isEmpty();
}
@AlsoNegation
注释表明该规则也可以匹配正文的逻辑否定@BeforeTemplate
。例如,代码str.length() != 0
将更改为!str.isEmpty()
.
该类TimeRules
包含时间表达式的各种重写规则,例如用 UTC 替换各种 Zone 偏移量:
@BeforeTemplate
ZoneId before() {
// `ZoneId.of("Z")` is not listed, because Error Prone flags it out of the box.
return Refaster.anyOf(
ZoneId.of("GMT"),
ZoneId.of("UTC"),
ZoneId.of("+0"),
ZoneId.of("-0"),
UTC.normalized(),
ZoneId.from(UTC));
}
@AfterTemplate
ZoneOffset after() {
return UTC;
}
或者用compareTo
更具可读性的方法替换该isBefore
方法:
@BeforeTemplate
boolean before(Instant a, Instant b) {
return a.compareTo(b) < 0;
}
@AfterTemplate
@AlsoNegation
boolean after(Instant a, Instant b) {
return a.isBefore(b);
}
Error Prone的安装说明可以作为基础,因为 Error Prone Support 建立在它之上。之后,相关的 Error Prone Support 模块应该添加到annotationProcessorPaths中,例如,使用maven-compiler-plugin:
<annotationProcessorPaths>
<!-- Error Prone. -->
<path>
<groupId>com.google.errorprone</groupId>
<artifactId>error_prone_core</artifactId>
<version>${error-prone.version}</version>
</path>
<!-- Error Prone Support's bug checks. -->
<path>
<groupId>tech.picnic.error-prone-support</groupId>
<artifactId>error-prone-contrib</artifactId>
<version>${error-prone-support.version}</version>
</path>
<!-- Error Prone Support's Refaster rules. -->
<path>
<groupId>tech.picnic.error-prone-support</groupId>
<artifactId>refaster-runner</artifactId>
<version>${error-prone-support.version}</version>
</path>
</annotationProcessorPaths>