@ Зменшення використання приміток


347

Я бачив якийсь метод у Java, оголошений як:

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

Що означає @Nullable ? Це означає, що вхід може бути null?

Без анотації вхід може бути нульовим, тому я думаю, що це не просто так?


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...щоб ваш намір став зрозумілим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.