虽然我认为应该有一个继承注释的一般规则,但我特别感兴趣的是让FindBugs识别我的规则,所以这个问题特定于FindBugs。
AFAIK,JavaDoc注释来自接口,在实现时被忽略。此概念是否也适用于@Nonnull
(或@NotNull
)?
给定@Override
注释,至少可以添加界面中不存在的其他注释。
以下情况会发生什么? FindBugs会识别所有这些吗?关于清洁代码,哪一个是首选的?
@Nonnull
,实施@Override
@Nonnull
,实施@Override
,@Nonnull
@Override,
@ Nonnull` 答案 0 :(得分:7)
选择选项2:
- 接口@Nonnull,实现@Override @Nonnull
醇>
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
子类中的不良扩展。