【问题标题】:Do I need to @Nonnull again at the implementation?我需要在实施时再次@Nonnull 吗?
【发布时间】:2015-05-07 19:15:59
【问题描述】:

虽然我认为是否应该有一个继承注释的一般规则,但我对让 FindBugs 识别我的规则特别感兴趣,所以这个问题是 FindBugs 特有的。

AFAIK,JavaDoc cmets 取自接口并在实现时被忽略。这个概念是否也适用于@Nonnull(或@NotNull)之类的注解?

鉴于@Override注解,至少可以添加界面中不存在的附加注解。

在以下情况下会发生什么? FindBugs 会识别所有这些吗?关于干净代码,哪一个是首选?

  1. 接口@Nonnull,实现@Override
  2. 接口@Nonnull,实现@Override@Nonnull
  3. 接口无注解,实现@Override,@Nonnull`

【问题讨论】:

  • 我建议你澄清这个问题,表明你只对 FindBugs 感兴趣而不是其他工具,或者表明你对任何空值检查工具的答案感兴趣。
  • @mernst:有一个 finbugs 标签,我想问 FindBugs 是否能识别所有这些标签。您还建议在哪里添加 FindBugs 参考以使其清晰?
  • 标签表示该问题与 FindBugs 相关,但仅添加标签并不表示该问题与 FindBugs 相关。大多数人会阅读问题的标题和文本,而不是标签。
  • @mernst:既然我应该not add it to the title,我已将其添加为我的问题的第一句话。

标签: java annotations javadoc findbugs


【解决方案1】:

接口上的注释声明所有实现不得返回null,而实现上的注释声明它遵守该合同。它不是遗传的,我认为也不是。

@CheckForNull 注释绝对不会被继承,因为子类可以缩小返回类型的空值,就像它们可以扩大它们接受的参数一样。

interface Credentials {
    @NonNull
    String getPassword();

    void setPassword(@NonNull password);
}

// Allows null password
class GoodCreds implements Credentials {
    // but cannot widen; throw exception for null instead
    @Overrides
    @NonNull
    String getPassword() {...}

    // can widen parameters
    @Overrides
    void setPassword(@CheckForNull password) {...}
}

注意:稍后我将添加匹配的用户名访问器来演示 BadCreds 子类中的不良扩展。

【讨论】:

    【解决方案2】:

    选择选项 2:

    1. 接口@Nonnull,实现@Override @Nonnull

    如果在正确的位置找到注释,FindBugs 和许多其他工具(例如 IDE)会做得更好。这些注解不会被继承,正如this section 底部的 JLS 所述:

    注解继承仅适用于类(不适用于方法、接口或构造函数)

    所以这些工具需要自己去寻找它们。有些工具可以做到,但即使是 FindBugs 也不能始终如一地做到这一点(我上次检查过)。

    【讨论】:

    • 我不明白为什么我们要把@Nonnull放在接口上,如果它不会被继承,请您详细说明一下吗?
    • @RobertBain 好吧,接口定义了合约,而空值要求是合约的一部分。如果我们不把注解放在接口上,只对接口起作用的代码就不会知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多