如何在默认情况下指示成员字段是@Nonnull?

时间:2012-08-02 11:16:34

标签: java findbugs jsr305

我的问题是this one的后续行动。

在过去的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?它甚至可能吗?

1 个答案:

答案 0 :(得分:21)

我有一个类似的问题,发现以下似乎适用于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;