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

jqn*_*qno 21 java findbugs jsr305

我的问题是后续这一块.

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

小智 21

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

使用以下注释定义创建java文件

@Nonnull
@TypeQualifierDefault(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldsAreNonNullByDefault
{
}
Run Code Online (Sandbox Code Playgroud)

类似地,强制来自方法的所有返回值都是非null

@Nonnull
@TypeQualifierDefault(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ReturnTypesAreNonNullByDefault
{
}
Run Code Online (Sandbox Code Playgroud)

然后正常注释包.

我使用以下代码进行测试(package-info.java)

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

package com.mypackagename.subpkg;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您在自定义注释中使用的"Nonnull"大小不同于JSR-305中使用的可能会引起混淆的大写注释. (8认同)
  • 啊,所以诀窍是定义你自己的注释...我猜这更具可扩展性,但我不明白他们为什么不能像使用ParametersAreNonnullByDefault那样为这个案例制作标准注释. (5认同)