使用 Checker Framework 时避免注入字段出现 'uninitialized' 错误

Avoid 'uninitialized' errors on injected fields when using the Checker Framework

Checker Framework's Nullness Checker 在遇到未初始化的字段时会产生错误。

[ERROR] /home/glts/src/example/src/main/java/BookRepositoryImpl.java:[39,7]
error: [initialization.fields.uninitialized] the constructor does not initialize fields: em

现在,通过依赖注入来注入一些字段是一种常见的模式:

@Repository
public class BookRepositoryImpl implements BookRepository {
    @PersistenceContext 
    private EntityManager em;

    @Override
    @Nullable
    public Book findById(int id) {
        return em.find(Book.class, id);
    }

    // ...
}

此处,@javax.persistence.PersistenceContext 注释确保 em 将在构建存储库后保存对 EntityManager 实例的引用。

更一般地说,在这些情况下,应用程序框架保证字段在使用时已初始化且非空 - 但检查器框架无法知道这一点。

到目前为止,我发现一种补救方法是将字段注入转换为构造函数注入 (@Inject)。不过,这不是上例中的一个选项。

有没有办法告诉 Checker Framework 字段已注入,因此正确初始化且非空,而不是简单地抑制这些错误?

您可以通过在字段声明中写入 @SuppressWarnings("initialization.fields.uninitialized") 来抑制单个字段的错误。

您可以通过在 class 上写入 @SuppressWarnings("initialization.fields.uninitialized") 来抑制所有字段的错误。

存在注入框架,可以将 null 作为值注入存在 @PersistenceContext 注释的地方,例如当 .xml 文件不存在时,代码不存在 运行 在事务中,等等。写 @SuppressWarnings("initialization.fields.uninitialized") 注释是一种表示您相信您正在使用的注释将始终为您的代码注入非空值的方式。