Error Prone Support引入了新的錯誤檢查和 Refaster 模板

“supermarket on wheels”公司 Picnic發(fā)布了Error Prone Support,這是一個開源項目,它擴展了 Google 的Error Prone,其中包含三十個新的錯誤檢查,用于檢測并選擇性地解決 Java 項目編譯期間可能出現(xiàn)的錯誤。超過五十個新的 Refaster 規(guī)則集合可用于通過自動重寫代碼庫來提高代碼一致性。
Error Prone 是一個 Java 編譯器插件,由 Google 開源,它在編譯期間執(zhí)行靜態(tài)分析以檢測錯誤或提出可能的改進建議。該插件包含 500 多個預定義錯誤檢查,并允許第三方和自定義插件。檢測到問題后,Error Prone 可以顯示警告或使用預定義的解決方案自動更改代碼。
最近發(fā)布的Error Prone Support提供的三十個新錯誤檢查之一是類,錯誤檢查將顯示警告或可選擇刪除以下方法:EmptyMethod
void method() {}
static void staticMethod() {}每當需要空方法時,可以使用以下注釋抑制誤報:
@SuppressWarnings("EmptyMethod")只要一個類只有一個構(gòu)造函數(shù),AutowiredConstructor錯誤檢查就會刪除冗余@Autowired注釋,如下例所示:
class Course {
@Autowired
Course() {}
}
class Student {
@Autowired
Student(String name) {}
}該類MethodReferenceUsage檢測 lambda 表達式并將它們轉(zhuǎn)換為方法引用。例如,() -> course.method()更改為course::method。
在 Error Prone 中編寫錯誤檢查涉及使用抽象語法樹(AST) 和 Error Prone 的 API。這通常是檢測錯誤所必需的,但在重寫代碼時通常不需要。Google 的Refaster更易于使用,現(xiàn)在是 Error Prone 的一部分。Refaster 規(guī)則可用于在 Java 中使用@BeforeTemplate和@AfterTemplate注釋定義重寫規(guī)則。Error Prone Support 提供了五十多個新的 Refaster 規(guī)則集合,其中包含 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注釋表明該規(guī)則也可以匹配正文的邏輯否定@BeforeTemplate。例如,代碼str.length() != 0將更改為!str.isEmpty().
該類TimeRules包含時間表達式的各種重寫規(guī)則,例如用 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的安裝說明可以作為基礎(chǔ),因為 Error Prone Support 建立在它之上。之后,相關(guān)的 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>