4

我目前使用

@DefaultAnnotation(NonNull.class)
package jobs;

import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
import edu.umd.cs.findbugs.annotations.NonNull;

但是注释 @edu.umd.cs.findbugs.annotations.DefaultAnnotation 已弃用: http ://findbugs.sourceforge.net/api/edu/umd/cs/findbugs/annotations/DefaultAnnotation.html

他们建议使用 javax.annotation.ParametersAreNonnullByDefault 但是,DefaultAnnotation 不仅针对参数,还针对字段和方法。

那么,默认情况下将字段和方法设置为 Nonnull 的 javax.annotation 替代方法是什么?

4

2 回答 2

4

据我所知,没有。想要同样的东西,我将ParametersAreNonnullByDefault复制到我自己的中FieldsAreNonnullByDefaultMethodsAreNonnullByDefault并将@TypeQualifierDefault值更改为匹配(FIELDMETHOD相应的)。FindBugs 完美地采用了这些新注释。

这是一个示例FieldsAreNonnullByDefault

package com.sample;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

import javax.annotation.meta.TypeQualifierDefault;

/**
 * This annotation can be applied to a package or class to indicate that the 
 * classes' fields in that element are nonnull by default unless there is
 * <ul>
 *   <li>an explicit nullness annotation
 *   <li>a default field annotation applied to a more tightly nested element.
 * </ul>
 */
@Documented
@Nonnull
@TypeQualifierDefault(ElementType.FIELD)  // <-- METHOD for return values
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldsAreNonnullByDefault {
}
于 2012-11-17T08:45:12.387 回答
1

所以从纯代码的角度来看,并没有什么大的区别。

一旦您之后开始分发代码,就会出现差异。

只要您不使用注释 jarJRE 发布您的代码,就应该没问题。

如果您正在分发 JRE,那么您已经知道您需要遵守Oracle Java 二进制许可证

您可能想用该许可的条款刷新自己,特别是:

F. JAVA 技术限制。您不得创建、修改或更改其行为,或授权您的被许可人创建、修改或更改以任何方式标识为“java”、“javax”、“ sun"、"oracle" 或 Oracle 在任何命名约定指定中指定的类似约定。

因此,如果您正在分发 JRE,并且同一分发包含一个在javax子包中定义类的 jar 文件,除非这些类符合由 JSR 发布和发布的规范,否则您将不遵守 Oracle Java 二进制许可的条款。

此时您应该查看JSR 305 官方页面

此时 JSR 尚未发布任何内容

JSR - 截至 2016 年 3 月 - 被列为休眠

因此,您需要确保不在 Windows 安装程序、OS-X 安装程序、Docker 映像等中的 JRE 旁边分发“jsr305.jar”文件。

于 2016-03-24T10:58:21.573 回答