2012-11-09 2 views
9

Ich habe den einfachen Code unten zum Testen der FindBugs @NonNull Annotation mit Maven. Ich ausführenSet findbugs NotNull als Standard für alle Klassen unter einem Paket

mvn clean install 

Und es nicht richtig zu bauen, weil print(null) die Nicht-Null-Bedingung verletzt.

Sie können innerhalb einer Klasse für alle Methodenparameter NonNull als Standard festgelegt, die Klasse Annotation mit

@DefaultAnnotation(NonNull.class) 

Wie ich NonNull als Standard für alle Methodenparameter innerhalb aller Klassen unter einem bestimmten Paket festlegen kann (und sub- Pakete)?

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

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>hello</groupId> 
    <artifactId>hello</artifactId> 
    <version>1.0</version> 

    <dependencies> 
    <dependency> 
     <groupId>net.sourceforge.findbugs</groupId> 
     <artifactId>annotations</artifactId> 
     <version>1.3.2</version> 
    </dependency> 
    <dependency> 
     <groupId>net.sourceforge.findbugs</groupId> 
     <artifactId>jsr305</artifactId> 
     <version>1.3.7</version> 
    </dependency> 
    </dependencies> 

    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <configuration> 
      <source>1.6</source> 
      <target>1.6</target> 
     </configuration> 
     </plugin> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>findbugs-maven-plugin</artifactId> 
     <version>2.5.2</version> 
     <configuration> 
      <includeTests>true</includeTests> 
     </configuration> 
     <executions> 
      <execution> 
      <phase>compile</phase> 
      <goals> 
       <goal>check</goal> 
      </goals> 
      </execution> 
      <execution> 
      <id>findbugs-test-compile</id> 
      <phase>test-compile</phase> 
      <goals> 
       <goal>check</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

Antwort

15

Sie können dies für einzelne Pakete tun, aber ich habe nicht einen Weg, um es zu Subpackages propagieren gefunden. Verwenden Sie für Methodenparameter die integrierte Paketannotation @ParametersAreNonnullByDefault. Wenden Sie die Annotation auf das Paket in der Datei package-info.java innerhalb des Paketverzeichnisses an.

Bitte beachte, dass ich mit den javax.annotation Anmerkungen aus JSR-305 welche FindBugs ehrt.

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; 

Bei Feldern und Methode Rückgabewerte Sie Ihre eigenen Anmerkungen benötigen, erstellen. Ich tat dies, indem ich die Quelle für ParametersAreNonnullByDefault kopierte und die enum änderte.

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 
} 

Ich begann vor ein ziemlich komplexes System von Grund auf ein paar Monate Umschreiben, und jedes Paket hat diese drei Anmerkungen angewendet (Felder, Parameter und Rückgabewerte). Ein Vorteil, der aus dem Anreiz zur Vermeidung von null Werten resultiert, ist die Verwendung des Null-Object-Musters, wo es angebracht ist. Das kombiniert mit der Bevorzugung der letzten Felder so viel wie möglich und kleinen Klassen, die nur eine Sache machen, hat den Code wirklich sauber gehalten.

1

Sie können dies auf Parameter tun, fileds und Rückgabewert der Methode gleichzeitig durch diese Zeilen in Ihre package-info.java setzen:

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

Wenn findbugs in diesem Paket auf dem Code ausgeführt wird, werden alle Methoden und Felder Es wird angenommen, dass sie nicht null sind, wenn Sie sie nicht mit @CheckForNull annotieren.

Ich weiß auch nicht eine Möglichkeit, dies für Unterpakete gelten. Ich mache das für jedes Paket.