2012-08-02 86 views
20

我的问题是this one的后续行动。默认情况下如何指示成员字段为@Nonnull?

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

回答

18

我也有类似的问题,发现下面似乎有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; 
+5

啊,所以诀窍是定义自己的注释。我想这是更多的可扩展性,但我不明白为什么他们不能像对待ParametersAreNonnullByDefault一样为这种情况制作标准注释。 – jqno 2012-08-06 07:31:50

+8

请注意,您在自定义注释中为'Nonnull'使用了不同的大写字母,而不是JSR-305中可能引起混淆的大写字母。 – 2012-09-20 21:03:21

相关问题