Использование аннотации NotNull в аргументе метода


Я только начал использовать @NotNull аннотация с Java 8 и получение некоторых неожиданных результатов.

у меня есть способ такой:

public List<Found> findStuff(@NotNull List<Searching> searchingList) {
    ... code here ...
}

Я написал тест JUnit, передающий нулевое значение для аргумента searchingList. Я ожидал, что произойдет какая-то ошибка, но она прошла так, как будто аннотации не было. Это ожидаемое поведение? Из того, что я понял, это должно было позволить вам пропустить написание шаблонной нулевой проверки код.

объяснение того, что именно @NotNull должен делать, было бы очень признательно.

4 53

4 ответа:

@Nullable и @NotNull ничего не делать самостоятельно. Они должны выступать в качестве инструментов документирования.

The @Nullable Аннотация напоминает вам о необходимости введения проверки NPE, когда:

  1. вызов методов, которые могут возвращать значение null.
  2. разыменование переменных (полей, локальных переменных, параметров), которые могут быть null.

The @NotNull Аннотация, На самом деле, явный контракт, объявляющий следующее:

  1. метод не должен возвращать значение null.
  2. переменной (например, поля, локальные переменные и параметры) не может содержать значение null.

например, вместо написания:

/**
 * @param aX should not be null
 */
public void setX(final Object aX ) {
    // some code
}

вы можете использовать:

public void setX(@NotNull final Object aX ) {
    // some code
}

Так что @NotNull просто тег...Если вы хотите проверить его, то вы должны использовать что-то вроде hibernate validator jsr 303

ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
Validator validator = validatorFactory.getValidator();
 Set<ConstraintViolation<List<Searching>> violations = validator.validate(searchingList);

Как уже упоминалось выше, @NotNull ничего не делает самостоятельно. Хороший способ использования @NotNull будет использовать его с объектами.requireNonNull(..).

public class Foo {
private final Bar bar;

public Foo(@NotNull Bar bar) {
    Objects.requireNonNull(bar, "bar must not be null");
    this.bar = bar;
}
}

сделать @NotNull активный вам нужен Ломбок:

https://projectlombok.org/features/NonNull

import lombok.NonNull;

выполните: какую аннотацию @ NotNull Java я должен использовать?