Иногда параметр метода не должен быть null вообще. Например, сервису нужен репозиторий, обработчику нужен клиент, а объекту доменной модели обязательное имя.
Часто это проверяют вручную:
public UserService(UserRepository repository) {
if (repository == null) {
throw new NullPointerException("repository");
}
this.repository = repository;
}Работает, но код становится шумным.
В Java для такой проверки есть Objects.requireNonNull():
public UserService(UserRepository repository) {
this.repository = Objects.requireNonNull(repository);
}Если передать null, ошибка появится сразу в конструкторе, а не где-то позже при первом вызове метода.
Можно добавить понятное сообщение:
this.repository = Objects.requireNonNull(
repository,
"repository must not be null"
);
Это особенно полезно в конструкторах:
public Order(String id, BigDecimal amount) {
this.id = Objects.requireNonNull(id, "id");
this.amount = Objects.requireNonNull(amount, "amount");
}И в методах, где null ломает смысл операции:
public void send(Message message) {
Objects.requireNonNull(message, "message");
transport.send(message);
}Но не стоит ставить requireNonNull() везде подряд. Если null нормальный вариант состояния, лучше явно отразить это в логике:
String label = user.getNickname() != null
? user.getNickname()
: user.getName();
Objects.requireNonNull() хорош там, где null является ошибкой. Он помогает падать раньше и ближе к месту неправильного вызова.
👉 Java Ready | #совет
