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

时间:2015-03-06 08:02:16

标签: java annotations javadoc findbugs

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

AFAIK,JavaDoc注释来自接口,在实现时被忽略。此概念是否也适用于@Nonnull(或@NotNull)?

等注释

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

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

  1. 界面@Nonnull,实施@Override
  2. 界面@Nonnull,实施@Override@Nonnull
  3. 接口没有注释,实现@Override, @ Nonnull`

2 个答案:

答案 0 :(得分:7)

选择选项2:

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

FindBugs和IDE等许多其他工具如果在正确的位置找到注释,会做得更好。这些注释不会被继承,因为JLS在this section的底部指出:

  

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

因此,工具需要自己寻找它们。哪些工具可以做,但是即使FindBugs也不能这样做(最后我检查过)。

答案 1 :(得分:3)

接口上的注释声明所有实现都不能返回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子类中的不良扩展。