在接口处指定时,是否需要在实现时使用注释

Ama*_*tam 5 java annotations

我想使用@Nonnull提供的注释,javax.annotaiton.Nonnull其中保留策略作为运行时.使用此注释,我想确保此函数永远不会返回null.我想在界面上添加注释,以便将来的实现不会破坏现有代码,如下所示

public interface X {
    @Nonnull public List<A> func();
}
Run Code Online (Sandbox Code Playgroud)

现在我不明白的是,我是否应该在实现上使用相同的注释.那么下面哪一个是编写这个接口的实现的正确方法(这两个编译):

public class XImpl implements X {
    @Override
    @Nonnull public List<A> func() {
         //code
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

public class XImpl implements X {
    @Override
    public List<A> func() {
         //code
    }
}
Run Code Online (Sandbox Code Playgroud)

mer*_*nst 6

通常,您应该查看注释的文档.不幸的是,javax.annotation.Nonnull注释不包含任何文档(!).注释由JSR 305提出,但JSR 305已被放弃.JSR 305没有提供语义,也没有提供参考实现.

您将需要使用某些工具处理注释,例如Checker FrameworkFindBugs.除了在接口上了解是否要在实现上编写注释之外,还需要查看该工具的文档.

检查框架手册说,你需要写注释的实施以及在界面上.这样可以提供更好的文档,因为您可以自己理解实现,而无需同时阅读界面.

该FindBugs的手册不包含单词"继承",也不是"继承",而消息 并没有回答有关注释和继承的邮件列表.FindBugs确实将一些注释(例如CheckReturnValue)视为继承,但您似乎无法保证@Nonnull的当前或未来行为.我建议明确地编写注释,这应该是安全的并且具有上面提到的文档优点.