将findbugs NotNull设置为包下所有类的默认值

我有下面的简单代码用于使用Maven测试FindBugs @NonNull注释。 我执行

 mvn clean install 

它正确无法构建,因为print(null)违反了非null条件。

您可以使用类注释将NonNull设置为类中所有方法参数的默认值

 @DefaultAnnotation(NonNull.class) 

如何将NonNull设置为给定包(和子包)下所有类中所有方法参数的默认值?

src/main/java/test/Hello.java

 package test; import edu.umd.cs.findbugs.annotations.NonNull; public class Hello { static public void print(@NonNull Object value) { System.out.println("value: " + value.toString()); } static public void main(String[] args) { if (args.length > 0) { print(args[0]); } else { print(null); } } } 

pom.xml

   4.0.0 hello hello 1.0   net.sourceforge.findbugs annotations 1.3.2   net.sourceforge.findbugs jsr305 1.3.7      org.apache.maven.plugins maven-compiler-plugin  1.6 1.6    org.codehaus.mojo findbugs-maven-plugin 2.5.2  true    compile  check    findbugs-test-compile test-compile  check        

您可以为单个包执行此操作,但我还没有找到将其传播到子包的方法。 对于方法参数,请使用内置包注释@ParametersAreNonnullByDefault 。 将注释应用于包的目录中的package-info.java文件中的包。

请注意,我正在使用JSR-305中的javax.annotation注释,这是FindBugs的荣誉。

com/example/foo/package-info.java

 /** * Package that doesn't allow null values as method parameters. */ @ParametersAreNonnullByDefault package com.example.foo; import javax.annotation.ParametersAreNonnullByDefault; 

对于字段和方法返回值,您需要创建自己的注释。 我通过复制ParametersAreNonnullByDefault的源并更改ElementType枚举来完成此操作。

com/example/util/FieldsAreNonnullByDefault.java

 package com.example.util; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import javax.annotation.Nonnull; import javax.annotation.meta.TypeQualifierDefault; /** * Applies the {@link Nonnull} annotation to every class field unless overridden. */ @Documented @Nonnull @TypeQualifierDefault(ElementType.FIELD) // <-- use METHOD for return values @Retention(RetentionPolicy.RUNTIME) public @interface FieldsAreNonnullByDefault { // nothing to add } 

几个月前,我开始从头开始重写一个相当复杂的系统,每个包都应用了这三个注释(字段,参数和返回值)。 避免null值的动机之一就是在适当的地方使用Null Object模式。 结合尽可能多地支持最终字段和只做一件事的小类确实保持了代码的清洁。

您可以通过将这些行放在package-info.java中来同时对参数,fileds和方法返回值执行此操作:

 @DefaultAnnotation(NonNull.class) package com.my.package; 

当findbugs在该包中的代码上运行时,除非使用@CheckForNull注释它们,否则假定所有方法和字段都是非空的。

我也不知道如何将其应用于子包。 我为每个包做这个。