Зачем мне использовать аннотацию Lombok @NonNull? - PullRequest
2 голосов
/ 24 июня 2019

Lombok предлагает аннотацию @NonNull, которая выполняет проверку нуля и выбрасывает NPE (если не настроено по-другому).

Я не понимаю, почему я использовал бы эту аннотацию, как описано в пример этой документации:

private String name;
public NonNullExample(@NonNull Person person) {
    super("Hello");
    if (person == null) {
      throw new NullPointerException("person is marked @NonNull but is null");
    }
    this.name = person.getName();
  }

В любом случае NPE будет брошен.Единственная причина здесь использовать аннотацию imo состоит в том, что вы хотите, чтобы исключение отличалось от NPE.

РЕДАКТИРОВАТЬ: я знаю, что исключение будет выброшено явно и, таким образом, «контролируется», но по крайней меретекст сообщения об ошибке должен быть редактируемым, не так ли?

Ответы [ 4 ]

1 голос
/ 24 июня 2019

Запись аннотации типа, такой как @NonNull, служит нескольким целям.

1 голос
/ 24 июня 2019

ИМХО, вы поняли , что страница документации ошибочно.

Эта страница документации не подразумевает , что вам рекомендуется использовать аннотации Lombok @NonNull и явные if (smth == null) throw … -подобные проверки в одно и то же время (в том же методе).

Это просто говорит о том, что такой код (давайте назовем его код A ):

import lombok.NonNull;

public class NonNullExample extends Something {
  private String name;

  public NonNullExample(@NonNull Person person) {
    super("Hello");
    this.name = person.getName();
  }
}

будет автоматически (внутренне) переведен Ломбоком в код, подобный приведенному в вопросе (назовем его код B ).

Но на этой странице документации не говорится, что для вас имеет смысл явно написать код B (хотя вам это разрешено; и Lombok даже попытается предотвратить двойную проверку в этом случае). Это просто говорит о том, что с Lombok вы теперь можете написать код A как это будет работать - он будет неявно преобразован в код B ).

Обратите внимание, что код B является кодом «ванильной Java». Не ожидается, что он будет обработан Lombok во второй раз. Таким образом, @NonNull в коде B представляет собой простую аннотацию, которая не влияет на поведение (по крайней мере, не с помощью Lombok).

Это отдельный вопрос, почему Lombok работает таким образом - почему он не удаляет @NonNull из сгенерированного кода. Сначала я даже думал , что это может быть ошибка на этой странице документации. Но, как объясняет автор Lombok в своем комментарии , @NonNull намеренно сохраняются для документации и возможной обработки другими инструментами.

0 голосов
/ 24 июня 2019

Служит для целей, аналогичных

java.util.Objects requireNonNull()

или предварительные условия Guava. Это просто делает код более компактным и быстрым.

0 голосов
/ 24 июня 2019

Идея аннотации состоит в том, чтобы избегать if (person == null) в вашем коде и поддерживать ваш код в чистоте.

...