我应该用@NonNull 注释标记接口及其实现吗?

Should I mark both the interface and its implementation with the @NonNull annotation?

在描述服务的界面中,我有类似这样的方法:

TaskCard saveTaskCard(@NonNull TaskCard card, User user);

我将 @NonNull (lombok) 注释放在参数之前,但如果实现中没有相同的注释,它就无法单独工作。也就是说,在class实现这个接口的方法中,我需要重新打上这个注解,从而导致代码重复。

@Override
@Transactional
public TaskCard saveTaskCard(@NonNull TaskCard taskCard, User user) {
    taskCard.setUser(user);
    return repository.save(taskCard);
}

问题是,这是应该的吗?如果你把这个注解只放在接口里,它们是不起作用的,如果你只把它放在实现接口的class里,那么API用户可能不理解null不能传递给这些方法。我该怎么办?

恕我直言,出于您所述的原因,您肯定应该复制它:

  • 放在界面上让用户看到
  • 把它放在实现上,以便 Lombok 可以检查它

这只是多余的,当您不考虑可空性实际上是类型的一部分时 - 在 Java 中不是,但它是现实(例如 Kotlin)。

不幸的是,Lombok 不能做得更好,它可以访问接口(不是父接口 class)。

有些工具可以帮助您始终如一地执行此操作(但我还没有尝试过),或者您可以编写一个简单的基于反射的测试。然后,还是会逼着你写多余的东西,但是忘记了会提醒你。