我是否需要在实施时再次@Nonnull?

2022-09-03 02:36:11

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

AFAIK,JavaDoc注释是从接口中获取的,并且在实现时被忽略。这个概念是否也适用于像(或)这样的注释?@Nonnull@NotNull

给定注释,至少可以添加界面上不存在的其他注释。@Override

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

  1. 接口 , 实现@Nonnull@Override
  2. 接口 , 实现 ,@Nonnull@Override@Nonnull
  3. 接口没有注释,实现@Nonnull”@Override,

答案 1

选择选项 2:

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

FindBugs和许多其他工具(如IDE)如果在正确的位置找到注释,则效果要好得多。这些注释不会被继承,正如本节底部的 JLS 所述:

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

因此,这些工具需要自己去寻找它们。有些工具可以做到这一点,但即使是FindBugs也不会始终如一地做到这一点(最后我检查了一下)。


答案 2

接口上的注释声明所有实现都不得返回,而实现上的注释声明它遵守该协定。它不是遗传的,我认为也没有。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


推荐