2012-11-09 22 views
9

Tôi có mã đơn giản dưới đây để kiểm tra chú thích FindBugs @NonNull với Maven. Tôi thực hiệnĐặt findbugs NotNull là mặc định cho tất cả các lớp theo gói

mvn clean install 

Và chính xác không thể xây dựng vì print(null) vi phạm điều kiện không trống.

Bạn có thể đặt NonNull như mặc định cho tất cả các thông số phương pháp bên trong một lớp bằng cách sử dụng lớp chú thích

@DefaultAnnotation(NonNull.class) 

Làm thế nào tôi có thể thiết lập NonNull như mặc định cho tất cả các thông số phương pháp trong mọi tầng lớp dưới một gói nhất định (và phụ gói)?

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> 

Trả lời

15

Bạn có thể làm điều này đối với các gói cá nhân, nhưng tôi đã không tìm thấy một cách để có nó tuyên truyền để các gói con. Đối với các tham số phương pháp, hãy sử dụng chú thích gói dựng sẵn @ParametersAreNonnullByDefault. Áp dụng chú thích cho gói trong tệp package-info.java bên trong thư mục của gói.

Lưu ý rằng tôi đang sử dụng chú thích javax.annotation từ JSR-305 danh hiệu 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; 

Đối với các trường và các giá trị phương pháp bù lại bạn sẽ cần phải tạo ra các chú thích của riêng bạn. Tôi đã thực hiện việc này bằng cách sao chép mã nguồn cho ParametersAreNonnullByDefault và thay đổi số 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 
} 

tôi bắt đầu viết lại một hệ thống khá phức tạp từ đầu một vài tháng trước đây, và mỗi gói có ba chú thích áp dụng (trường, các thông số và giá trị trả lại). Một lợi ích xuất phát từ sự khuyến khích để tránh các giá trị null đang sử dụng mẫu đối tượng Null khi thích hợp. Điều đó kết hợp với các lĩnh vực ưu tiên cuối cùng càng nhiều càng tốt và các lớp học nhỏ mà làm một điều chỉ thực sự giữ mã sạch sẽ.

1

Bạn có thể làm điều này với các thông số, fileds và giá trị phương thức hoàn trả cùng một lúc bằng cách đặt những dòng này trong package-info.java của bạn:

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

Khi FindBugs chạy trên mã trong gói phần mềm đó, tất cả các phương pháp và các lĩnh vực được giả định là không null trừ khi bạn chú thích chúng với @CheckForNull.

Tôi cũng không biết cách để áp dụng điều này cho các gói phụ. Tôi làm điều này cho mỗi gói.

Các vấn đề liên quan