最终字段上的非空注释,以满足FindBugs和IntelliJ IDEA

时间:2017-01-01 04:10:42

标签: java findbugs

我正在尝试编写一个使用@Nonnull来标记所需参数的不可变数据类。不幸的是,无论我写它的方式,FindBugs标志着一个警告:

/**
 * An error occuring during migration
 */
@Immutable
@ParametersAreNonnullByDefault
public static final class MigrationError extends MigrationResult
{
    private final String message;

    private MigrationError(String message)
    {
        this.message = message;
    }

    @Override
    public boolean isSuccess()
    {
        return false;
    }

    @Nonnull
    public final String getMessage()
    {
        return message;
    }

    @Override
    public MigrationError asError()
    {
        return this;
    }
}

如上所述,这会导致正确性警告 - 空指针取消引用,Method可能返回null,但声明为@Nonnull。我试过在构造函数中添加一个null检查:

    private MigrationError(String message)
    {
        if (message == null)
        {
            throw new IllegalArgumentException("Error message cannot be null");
        }
        this.message = message;
    }

然而,警告仍然存在,我现在还有一个来自Intellij的警告:'message == null'始终为false。如果我在getter中添加一个null检查:

    @Nonnull
    public final String getMessage()
    {
        if (message == null)
        {
            return "";
        }
        return message;
    }

我从IntelliJ得到了相同的警告,FindBugs给了我一个新的警告:狡猾的代码:与null的冗余比较:已知非空值的冗余nullcheck。如果我删除显式空检查并将@Nonnull添加到message字段,我会收到相同的FindBugs警告。

我可以抑制警告,但我想知道FindBugs的期望。是否有一些模式用于声明不可变字段NonNull?它是否是其父类中的静态嵌套类是否重要?

0 个答案:

没有答案