我应该在接口和它的实现类上都使用@NonNull注解吗?

12

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

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

我在参数前放了@NonNull(lombok)注释,但如果相同的注释未出现在实现中,则无法单独使用。 这意味着在实现该接口的类的方法中,我需要再次放置此注释,从而重复代码。

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

问题在于,这是否是正确的做法?如果你只把这个注解放在接口中,它们将不起作用,而如果你只把它放在实现接口的类中,那么API用户可能不会理解这些方法不能传递null。我该怎么办?


为什么你在Service中使用@NonNull,我认为它应该在Controller中使用。 - Eklavya
1
@Eklavya 在控制器中,我获取已验证且不为空的DTO。在服务中,我决定添加这些注释只是为了安全起见,以防有人决定传递null,这样你就可以立即看到NullPointer所在的位置。这样做是否正确? - NarasuOo
1个回答

6

在我看来,你肯定应该为以下原因重复它:

  • 将其放在接口上以便用户可见
  • 将其放在实现上以便Lombok可以检查它

只有当你不考虑空值实际上是类型的一部分时才会感到多余 - 虽然在Java中不是这样,但在实际情况(例如Kotlin)中是这样的。

不幸的是,Lombok无法做得更好,并且它无法访问接口(而不是父类)。

有些工具可以帮助您保持一致性(但我还没有尝试过),或者您可以编写一个简单的基于反射的测试。 然后,您仍将被迫编写冗余内容,但如果您忘记了,您将会受到提醒。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接