2012-11-09 6 views
9

मेरे पास मेवेन के साथ FindBugs @NonNull एनोटेशन का परीक्षण करने के लिए नीचे दिया गया सरल कोड है। मैं निष्पादितपैकेज के तहत सभी कक्षाओं के लिए डिफ़ॉल्ट रूप से Findbugs NotNull सेट करें

mvn clean install 

और इसे सही ढंग से निर्माण करने के लिए क्योंकि print(null) में गैर-शून्य हालत का उल्लंघन करती है विफल रहता है।

आप वर्ग एनोटेशन

@DefaultAnnotation(NonNull.class) 

मैं कैसे किसी दिए गए पैकेज के अंतर्गत सभी वर्गों के अंदर सभी विधि पैरामीटर के लिए डिफ़ॉल्ट (और उप के रूप में NonNull सेट कर सकते हैं का उपयोग कर 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

<?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> 

उत्तर

15

आप अलग-अलग पैकेज के लिए ऐसा कर सकते हैं, लेकिन मैं इसे सबपैकेज तक पहुंचने के लिए एक तरह से नहीं मिली है। विधि पैरामीटर के लिए अंतर्निहित पैकेज एनोटेशन @ParametersAreNonnullByDefault का उपयोग करें। पैकेज की निर्देशिका के अंदर package-info.java फ़ाइल में पैकेज में एनोटेशन लागू करें।

ध्यान दें कि मैं एनोटेशन JSR-305 से उपयोग कर रहा हूं जो FindBugs honors।

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 enum को बदलकर ऐसा किया।

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 मानों से बचने के लिए प्रोत्साहन से बाहर आने वाला एक लाभ शून्य जहां ऑब्जेक्ट पैटर्न का उपयोग कर रहा है। जो कि अंतिम फ़ील्ड के पक्ष में जितना संभव हो सके छोटे और छोटे वर्गों के साथ मिलकर जो एक चीज करता है, ने वास्तव में कोड को साफ रखा है।

1

आप अपने package-info.java में इन पंक्तियों डालकर एक साथ पैरामीटर, फ़ील्ड और विधि वापसी मान को यह कर सकते हैं:

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

FindBugs कि पैकेज में कोड पर चलता है, सभी तरीकों और खेतों तब तक गैर-शून्य माना जाता है जब तक कि आप उन्हें @ चेकफ़ोरनुल के साथ न दें।

मुझे यह सब-पैकेज पर लागू करने के तरीके के बारे में भी पता नहीं है। मैं यह प्रत्येक पैकेज के लिए करता हूँ।

संबंधित मुद्दे

 संबंधित मुद्दे