是否存在默认的类级别注释,该注释未被弃用,默认情况下指定非空返回值

时间:2015-02-03 17:10:03

标签: java annotations findbugs

谷歌让我失望了。曾经有过这样的注释:  ReturnValuesAreNonnullByDefault

但现在不推荐这样做了,javadoc并没有指出要使用哪个新注释。整个类的@Nonnull不适用于返回值,因为我刚刚测试了它,并且我没有得到返回null的方法的警告。我不想特别注释每一个返回值,那么有一个很好的选择吗?

2 个答案:

答案 0 :(得分:2)

您可以使用this answer构建自己的简单@EverythingIsNonnullByDefault注释,以便在包/类级别应用以涵盖所有情况,或this one向您展示如何创建单独的注释管理字段和方法返回值。我们选择使用它们,但倾向于使用"所有内容"包级别的版本。

如果您真的很匆忙,请复制粘贴已弃用的注释并删除弃用。

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' methods in that element all return nonnull values by default
 * unless there is
 * <ul>
 *   <li>an explicit nullness annotation
 *   <li>a default method annotation applied to a more tightly nested element.
 * </ul>
 */
@Documented
@Nonnull
@TypeQualifierDefault(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ReturnValuesAreNonnullByDefault {
    // feel free to name it MethodsAreNonnullByDefault; I find that confusing
}

答案 1 :(得分:2)

如果您使用Checker Framework,则可以使用@DefaultQualifier。例如,你可以写

@DefaultQualifier(value=NonNull.class, locations=DefaultLocation.RETURNS)

但是,您不需要这样做,因为Checker Framework的Nullness Checker已经使用了该默认值。 (正如您所发现的,最好的默认设置是假设每个方法都返回null。)

Nullness Checker的一个优点是它可以检测到比FindBugs更多的与空指针相关的错误。

Nullness Checker是compatible,带有FindBugs的注释,因此您可以尝试Nullness Checker,而无需更改代码中的现有FindBugs注释。