Error Prone Support引入了新的错误检查和 Refaster 模板
共 4123字,需浏览 9分钟
·
2022-12-22 09:06
“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>