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

347

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

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

В чем смысл @Nullableздесь? Означает ли это, что вход может быть null?

Без аннотации входной сигнал все еще может быть нулевым, так что я думаю, что это не только так?

user1508893
источник
3
Из приведенных ниже ответов я узнал, что аннотация указывает на допустимость нулевых значений, примеры его использования, анализаторы кода, которые я могу опробовать, и что интерпретации могут различаться. Видишь, почему этот формат хорош? +1 со всех сторон, особенно за вопрос.
Ледяной воды
8
Какая библиотека предоставляет @Nullableв контексте вашего вопроса? Это проверка?
8bitjunkie

Ответы:

367

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

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

Дж. Б. Низет
источник
82

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

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

Адам Шнайдер
источник
1

Конечно, в моем мире определенно другое мышление, я не могу применить «Никогда не пропускай ноль», потому что имею дело с неконтролируемыми третьими сторонами, такими как вызывающие 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...чтобы ваше намерение было ясным.

Манабу Токунага
источник