javax.annotation.Nonnull vs assert
Я использую Findbugs и javax.annotation.Nonnull по параметрам метода.
В приватных методах я обычно добавляю строку assert для проверки на нулевое значение, например
private void myMethod(@Nonnull String str) {
assert str != null
....
В последней версии Netbeans (7.3rc2) сообщается, что проверка утверждения не требуется (из-за аннотации Nonnull). Я не совсем уверен, что это ошибка Netbeans или нет.
Можно ли удалить строку подтверждения, потому что я указал аннотацию @Nonnull?
Насколько я понимаю, аннотация используется только во время статического анализа, в то время как assert активен во время выполнения, поэтому двойки не являются альтернативой.
4 ответа
Утверждение оценивается во время выполнения, аннотация помогает FindBugs обнаруживать проблемы во время анализа перед выполнением. Поскольку обе проверки на самом деле не противоречат друг другу, вы можете оставить их обе. Я был бы раздражен, если бы моя IDE сказала мне удалить assert.
Netbeans прав. Если вы думаете, что оно может быть нулевым: удалите аннотацию. Если вы знаете, что не можете: удалите утверждение.
Если есть ЛЮБОЙ шанс, что ваш метод может быть вызван с нулевым значением, то @Nonnull
аннотации быть не должно.
Как вы сказали, эта аннотация на самом деле ничего не делает во время выполнения: она используется только IDE и инструментами статического анализа кода. Это не гарантирует, что вещи не равны нулю.
Поскольку это закрытый метод, мы можем гарантировать, что аннотированный параметр не может быть нулевым. Я думаю, что вы можете удалить это утверждение.
Если NetBeans предупреждает публичный метод, я думаю, что это проблема. Я рекомендую вам поставить утверждение.
Если вы все еще чувствуете, что утверждение в приватном методе необходимо, я думаю, вы можете использовать инъекцию байт-кода. Например, вот плагин maven для вставки нулевой проверки. Извините, это мой личный проект, но он работает для меня. Я думаю, это может удовлетворить ваши потребности. https://github.com/KengoTODA/jsr305-maven-plugin
Я нашел другое решение, так как думал о предупреждениях IDE.
Первоначально я чувствовал, что IDE был неправ. Я - параноидальный программист, и хочу иметь ярлык для документации и статического анализа И проверки во время выполнения на случай, если я когда-либо использую его по рефлексии, или другой язык JVM или что-то, что не статически анализируемо, поэтому я подумал, что это неправильно дать мне предупреждение и сказать мне assert(x != null)
заявление не было необходимо.
Но потом я подумал о том, как утверждения могут быть удалены в зависимости от статуса -ea
флаг передается в Java во время выполнения, и это в некотором смысле assert
а также @Nonnull
действительно обе проверки только для разработки.
Оказывается, есть фактическая проверка времени выполнения, которую можно вставить (Java 7+) Objects.requireNonNull
который бросит NullPointerException
и не может быть удален с -ea
утверждение. Я думаю, что я собираюсь предпочесть это моим assert(x != null); use(x);
шаблон.
public ConstructorForClass(@Nonnull Type x) {
this.x = Objects.requireNonNull(x);
//...
}