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

时间:2014-12-24 13:26:20

标签: java annotations

我正在考虑使用@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
    }
}

1 个答案:

答案 0 :(得分:6)

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

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

Checker Framework manual表示您需要在实现和接口上编写注释。这样可以提供更好的文档,因为您可以自己理解实现,而无需阅读界面。

FindBugs手册中不包含“inherit”和“inheritance”字样,并且没有回答有关注释和继承的messages to the邮件列表。 FindBugs确实将某些注释(例如CheckReturnValue)视为继承,但您似乎无法保证@Nonnull的当前或未来行为。我建议明确地编写注释,这应该是安全的并且具有上面提到的文档优势。