我正在考虑使用@Nonnull
中提供的javax.annotaiton.Nonnull
注释,该注释具有保留策略作为运行时。使用此注释,我想确保此函数永远不会返回null。我想在界面上添加注释,以便将来的实现不会破坏现有代码,如下所示
public interface X {
@Nonnull public List<A> func();
}
现在我不明白的是我应该在实现上使用相同的注释。那么下面哪一个是编写这个接口实现的正确方法(这两个都是编译):
public class XImpl implements X {
@Override
@Nonnull public List<A> func() {
//code
}
}
或者
public class XImpl implements X {
@Override
public List<A> func() {
//code
}
}
答案 0 :(得分:6)
通常,您应该查看注释的文档。不幸的是,javax.annotation.Nonnull annotation不包含任何文档(!)。注释由JSR 305提出,但JSR 305已被放弃。 JSR 305没有给出语义,也没有提供参考实现。
您需要使用某些工具处理注释,例如Checker Framework或FindBugs。除了在接口上了解是否在实现上编写注释之外,还需要查看该工具的文档。
Checker Framework manual表示您需要在实现和接口上编写注释。这样可以提供更好的文档,因为您可以自己理解实现,而无需阅读界面。
FindBugs手册中不包含“inherit”和“inheritance”字样,并且没有回答有关注释和继承的messages to the邮件列表。 FindBugs确实将某些注释(例如CheckReturnValue)视为继承,但您似乎无法保证@Nonnull的当前或未来行为。我建议明确地编写注释,这应该是安全的并且具有上面提到的文档优势。