Пользовательская аннотация `NonNull` в Lombok

Вот java-doc NonNull аннотации Lombok:

Если задан параметр, ломбок вставит нулевую проверку в начало тела метода / конструктора, выбрасывая {@code NullPointerException} с именем параметра в качестве сообщения. Если поместить в поле, любой сгенерированный метод, присваивающий значение этому полю, также произведет эти проверки на null. Обратите внимание, что любая аннотация с именем {@code NonNull} с любым регистром и любым пакетом приведет к проверке нуля, созданной для сгенерированных методов (и аннотация будет скопирована в возвращаемый тип получателя и любые параметры сгенерированных методов), но только < / em> эта аннотация, если она присутствует в параметре, приведет к нулевой проверке, вставленной в ваш рукописный метод.

ВНИМАНИЕ! Если сообщество Java когда-либо решит поддерживать одну аннотацию {@code @NonNull} (например, через JSR305), эта аннотация будет удалена из пакета lombok. Если необходимость обновить оператор импорта пугает вас, вы должны использовать свою собственную аннотацию с именем {@code @NonNull} вместо этой.

Каков самый простой способ иметь мою собственную аннотацию, скажем NonNull Nonnull, и Lombok, чтобы ввести нулевую проверку на основе моей аннотации?

Обновление: мой вопрос актуален для использования аннотации для аргументов метода.


person Rad    schedule 08.04.2017    source источник


Ответы (1)


Во-первых, вам нужно назвать его nonNull (регистр значения не имеет). NotNull не будет распознан Ломбоком. Кроме того, вам необходимо установить другую аннотацию Lombok (например, @Data, @Setter, ...), чтобы ваш тип обрабатывался Lombok.

Подведение итогов вашей пользовательской аннотации, вероятно, не так важно, как сама @lombok.NonNull-аннотация. Примером, в котором вы выигрываете от @lombok.NonNull-annotation, где ваша пользовательская аннотация даже не будет обрабатываться, - это когда ваш тип не содержит никакой другой аннотации Lombok, например:

class NoLombokAnnotationsAnywhere {
  void testMe(@lombok.NonNull String nonNull) { /* .. */ }
}

выдаст NullPointerException, как только вы вызовете new NoLombokAnnotationsAnywhere().testMe(null). Принимая во внимание, что это ничего не вызовет с вашей пользовательской аннотацией. Конечно, это применимо только до тех пор, пока у вас нет других аннотаций Lombok. Как только тип обрабатывается Lombok, обрабатывается и ваша аннотация.

Если у вас есть собственная NonNull-аннотация, вы можете добавить еще одну аннотацию Lombok, которая кажется подходящей, и Lombok добавляет для вас нулевую проверку, например:

@Data
class NonNullData {
  @mycustom.Nonnull
  String value;
}

// Calling the following throws a NullPointerException as expected
new NonNullData(null);

Вы также можете обнаружить следующую проблему: Поддержка аннотаций с именами @NotNull и @NonNull

person Roland    schedule 10.04.2017
comment
Спасибо за ответ. Насчет NotNull, ты прав. Это была просто опечатка. Фиксированный. Но об остальном ответе: использование аннотации, отличной от Lombok, вводит утверждения только тогда, когда метод генерируется Lombok (например, ваш пример NonNullData), в противном случае это не имеет никакого эффекта, даже если вы сделаете класс обрабатываемым для Lombok (например, добавив @Data). Это четко указано в документации. Я обновил свой вопрос, чтобы было понятнее. Спасибо. - person Rad; 16.04.2017
comment
Я не уверен, правильно ли я вас понимаю ... ваша пользовательская Nonnull-аннотация приводит к NullPointerException только в том случае, если код обрабатывается и генерируется Lombok. Это тот случай, если есть что-то вроде @Data (но также может быть @AllArgsContructor) и если вы разместите свою пользовательскую аннотацию @nonnull в поле. Однако, если вы сами предоставите какой-либо из конструкторов / методов и разместите на нем настраиваемую аннотацию, это не будет иметь никакого эффекта. Однако для этого @lombok.NonNull может работать ... Надеюсь, теперь стало понятнее? - person Roland; 18.04.2017
comment
Да, и это именно мой вопрос, как заставить Lombok обрабатывать мою аннотацию так же, как и свою собственную. Если вы используете ненулевую аннотацию Lombok, то он вводит нулевое утверждение как для автоматически сгенерированного, так и для написанного вручную кода. Спасибо. - person Rad; 19.04.2017