Следует ли отмечать и интерфейс, и его реализацию аннотацией @NonNull? - PullRequest
2 голосов
/ 17 июня 2020

В интерфейсе, описывающем службу, у меня есть методы, подобные этому:

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 нельзя передать этим методам. Что мне делать?

1 Ответ

1 голос
/ 17 июня 2020

IMHO, вы обязательно должны продублировать его по причинам, которые вы указали:

  • поместите его в интерфейс, чтобы пользователь его увидел
  • поместите его в реализацию, чтобы Lombok мог проверить it

Это только избыточно, если вы не считаете, что допустимость значений NULL на самом деле является частью типа - не в Java, но на самом деле (и, например, Kotlin), так и есть.

К сожалению, Lombok не может сделать ничего лучше, и он может получить доступ к интерфейсу (не к родительскому классу).

Существуют инструменты, которые могут помочь вам делать это последовательно (но я не пробовал их еще нет) или вы можете написать простой тест на основе рефлексии. Тогда вы все равно будете вынуждены писать лишний материал, но вам напомнят, если вы забудете.

...