@ Обнуляемое использование аннотаций
Я видел какой-то метод в 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