Error Prone Support引入了新的错误检查和 Refaster 模板

Java研发军团

共 4123字,需浏览 9分钟

 · 2022-12-22

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>







浏览 23
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报