一尘不染

如何指示成员字段默认为@Nonnull?

java

在过去的FindBugs版本中,可以使用@DefaultAnnotation(Nonnull.class)@DefaultAnnotationForFields(Nonnull.class)指示包中的所有
字段
都应视为@Nonnull。在FindBugs的(2.0)的当前版本@DefaultAnnotation@DefaultAnnotationForFields已被弃用,并且我们都应该使用JSR-305来代替。但是,JSR-305似乎并未涵盖(现已弃用的)FindBugs注释所涵盖的所有内容。

javadoc的确实表明了一些替代品:

  • @ParametersAreNonnullByDefault。这(显然)仅适用于参数,不适用于成员字段。
  • @CheckReturnValue,当应用于类型或包时。同样,这不适用于成员字段。
  • @TypeQualifierDefault。也许这可以满足我的要求,但是我不了解它的工作原理,除了一些神秘的javadoc,我无法找到任何有关其用法或意图的文档或示例。我认为这将帮助我创建自己的注释,但是我可以确定所有工具(FindBugs,Eclipse等)都可以正确(甚至根本)解释这个新注释吗?

javadoc中没有提供关于如何处理其弃用任何提示。

因此,使用FindBugs和/或JSR-305的当前版本,我应该如何指示某个包(甚至某个类)中的所有成员字段都应被视为@Nonnull?可能吗?


阅读 249

收藏
2020-12-03

共1个答案

一尘不染

我有一个类似的问题,发现以下内容似乎适用于findbugs(2.0.1-rc2)

使用以下注释定义创建一个Java文件

@Nonnull
@TypeQualifierDefault(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldsAreNonNullByDefault
{
}

类似地,强制所有方法的返回值都不为空

@Nonnull
@TypeQualifierDefault(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ReturnTypesAreNonNullByDefault
{
}

然后像往常一样注释该程序包。

我将以下内容用于测试(package-info.java)

@javax.annotation.ParametersAreNonnullByDefault
@com.habit.lib.lang.FieldsAreNonNullByDefault
@com.habit.lib.lang.ReturnTypesAreNonNullByDefault

package com.mypackagename.subpkg;
2020-12-03