【问题标题】:Is there a default, class-level annotation that is NOT deprecated that specifies non-null return values by default是否有一个默认的、未弃用的类级别注释,它默认指定非空返回值
【发布时间】:2015-02-03 17:10:03
【问题描述】:

Google 让我失望了。以前有这个注解: ReturnValuesAreNonnullByDefault.

但现在已弃用,javadoc 并未指出要使用哪个新注解。整个类上的@Nonnull 不适用于返回值,因为我刚刚对其进行了测试,并且没有收到返回 null 的方法的警告。我不想专门注释每个返回值,那么有没有好的选择?

【问题讨论】:

标签: java annotations findbugs


【解决方案1】:

您可以使用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
}

【讨论】:

    【解决方案2】:

    如果您使用的是Checker Framework,那么您可以使用@DefaultQualifier。例如,你可以写

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

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

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

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

    【讨论】:

    • 我使用的是 Findbugs,因为我公司的其他团队正在使用它。我将研究 Checker 框架,因为它具有更多的错误发现能力。感谢您让我知道!
    • 啊,我明白了。最初的问题没有指定 FindBugs。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 2021-11-16
    • 2013-01-19
    • 2019-06-22
    • 2014-12-10
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    相关资源
    最近更新 更多