@ Обнуляемое использование аннотаций

Я видел какой-то метод в Java, объявленный как:

void foo(@Nullable Object obj)
{ ... }

Что значит @Nullable Вот? Означает ли это, что вход может быть null? Без аннотации входное значение все еще может быть нулевым, так что я думаю, что это не только так?

Спасибо

3 ответа

Решение

Это дает понять, что метод принимает нулевые значения, и что если вы переопределите метод, вам также следует принять нулевые значения.

Он также служит подсказкой для анализаторов кода, таких как FindBugs. Например, если такой метод разыменовывает свой аргумент без предварительной проверки на нулевое значение, FindBugs выдаст предупреждение.

Эта аннотация обычно используется для устранения NullPointerExceptions, @Nullable часто говорит, что этот параметр может быть null, Хороший пример такого поведения можно найти в Google Guice. В этой легкой структуре внедрения зависимостей вы говорите, что эта зависимость может быть null, Если бы вы попытались пройти null и без аннотации фреймворк откажется выполнять свою работу.

Что больше @Nullable может быть использован с @NotNull аннотаций. Здесь вы можете найти несколько советов, как правильно их использовать. Проверка кода в In telliJ проверяет аннотации и помогает отлаживать код.

Различные инструменты могут интерпретировать значение @Nullable по-другому. Например, ht tps://checkerframework.org/ и FindBugs обрабатывают @Nullable по-разному.

Конечно, есть определенно другое мышление, в моем мире я не могу заставить "Никогда не передавать ноль", потому что имею дело с неконтролируемыми третьими сторонами, такими как вызывающие API, записи базы данных, бывшие программисты и т. Д., Поэтому я параноик и защищаюсь. Поскольку вы используете Java8 или более позднюю версию, существует более чистый подход, чемif блок.

public String foo(@Nullable String mayBeNothing) {
   return Optional.ofNullable(mayBeNothing).orElse("Really Nothing");
}

Вы также можете создать исключение, поменяв местами .orElse к orElseThrow(() -> new Exception("Dont' send a null")).

Если вы не хотите использовать @Nullable, который ничего не добавляет функционально, почему бы просто не назвать параметр с помощью mayBe... так что ваше намерение ясно.

Элемент, отмеченный как @Nullable Утверждает, что нулевое значение вполне допустимо для возврата (для методов), передачи (для параметров) и удержания (для локальных переменных и полей).

Элемент, отмеченный как @NotNull Утверждает, что нулевое значение запрещено возвращать (для методов), передавать в (для параметров) и удерживать (для локальных переменных и полей).

Существует ковариационно-контравариантная связь между @Nullable а также @NotNull при переопределении / реализации методов с аннотированным объявлением или параметрами.

Переопределение / реализация методов с аннотированным объявлением:

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

Переопределение / реализация методов с аннотированными параметрами:

  • @Nullable аннотация параметра в родительском методе требует @Nullable аннотация для параметра метода дочернего класса.
  • Методы с @NotNull аннотация параметра в родительском методе может иметь @Nullable или же @NotNull аннотации (или ни одной из них) для параметра метода дочернего класса.

Пример:

@Nullable
public static UserContext getThreadUserContext() {
    TransactionParms tp = TransactionParms.getBoundParms();
    return (tp == null) ? null : tp.getUserContext();
}

Вот getThreadUserContext метод должен вернуть экземпляр TransactionParms, Но этот экземпляр может быть Null

Другие вопросы по тегам