25

我的问题是对这个问题的跟进。

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

4

1 回答 1

25

我有一个类似的问题,发现以下似乎适用于 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;
于 2012-08-04T10:41:52.777 回答