Статьи

Аннотируйте свой код, чтобы найти больше ошибок

Недавно мы говорили о защите вашей репутации с помощью Статического анализа кода . В этой статье мы будем опираться на эту технику и покажем некоторые аннотации JSR-305 , которые могут помочь IntelliJ IDEA обнаружить еще более сложные проблемы в вашем коде и тем самым помочь вам сохранить карьеру опытного профессионального разработчика.

Чтобы кратко изложить историю, IntelliJ IDEA поставляется со встроенным мощным средством статического анализа кода . Этот интеллектуальный движок активно сканирует ваш код в фоновом режиме, пока вы думаете или печатаете, создает абстрактное синтаксическое дерево (AST) из кода, а затем ищет известные ошибки, проблемы, нарушения правил стиля и тому подобное в AST. Обнаруженные проблемы мгновенно выделяются в редакторе, чтобы вы могли их исправить. Сразу пока ты еще помнишь код и что он делает. При статическом анализе кода вы, как правило, избавляетесь от многих ошибок задолго до того, как сохраните файл, скомпилируете проект и запустите модульные тесты.

Предложение JSR-305 предлагает несколько вспомогательных аннотаций, таких как @Nullable , @NotNull или @Tainted, чтобы вы могли пометить определенную метаинформацию в своем коде. Вы можете указать ограничения, которые выполняются для определенного метода, поля, параметра или переменной. Например, вы можете указать, что конкретный метод может вернуть значение null, и тем самым помочь механизму проверки найти потенциальное исключение NullPointerException , возникающее из вашего кода.

Вы видите предупреждение? Поскольку getName () может возвращать ноль , код неправильно обрабатывает потенциально нулевое значение в поле имени .

Пометка того же метода с помощью @NotNull удалит предупреждение, поскольку теперь ваш код может свободно предполагать, что имя не содержит нулевого значения, и поэтому исключение NullPointerExceptions не может произойти.

Разумный шаг — позволить аннотациям @Nullable и @NotNull влиять на поведение приложения во время выполнения.

После проверки « Добавить @NutNull утверждения флажка» в настройках компилятора, IntelliJ IDEA повысит сгенерированные байты-код с проверками для значений нуля везде , где @NotNull используются аннотации и пусть код бросок IllegalArgumentException если @NutNull правило получает нарушается. Вы не получите неприятного исключения NullPointerException где-то далеко в будущем, но вместо этого приложение завершится сбоем, за исключением того, что в вашем коде будет указано точное место, с которого следует начать поиск проблемы — место, где ваши ожидания, выраженные в аннотации, не ‘ не соответствует действительности.

Проблемы интернационализации

Давайте перейдем к следующему удобному способу — аннотация @NonNls может использоваться для пометки строковых значений как не зависящих от локали. Поскольку IntelliJ IDEA хочет помочь вам в создании локализованных приложений, он может жаловаться, когда вы пытаетесь использовать жестко запрограммированное значение String в контексте, чувствительном к интернационализации. Помечая поле или параметр как @NonNls, вы указываете, что жестко закодированные нелокализованные значения могут быть приняты.

Файлы свойств

В аналогичном примечании вы также можете объявить переменную как @PropertyKey, и поэтому механизм может проверить, относится ли значение, хранящееся в переменной, к действительному ключу в данном файле свойств. И как только мета-информация станет доступной, она, очевидно, будет использоваться для вашего дальнейшего преимущества — для заполнения диалогового окна завершения для вас, если вы нажмете Control + Пробел .

Пользовательские шаблоны для строковых значений

С аннотацией @Pattern вы убедитесь, что аннотированный элемент всегда содержит значение String, соответствующее предоставленным регулярным выражениям.

У аннотации @Pattern есть два полезных потомка — аннотации @PrintFormat и @Identifier . Это два предопределенных особых случая аннотации @Pattern .
И да, вы правы — определение ваших собственных производных аннотаций очень просто:

@Pattern("\\d+")
public @interface Number { }

Встроенные языки

И последнее, но не менее важное: мы уже говорили о внедрении языка с аннотацией @Language . Проверьте это, это очень полезно, если вы объединяете технологии и языки в своих проектах.

Все вместе

Итак, теперь представьте, что эти аннотации объединены в вашем коде. Хотя вам необходимо добавить аннотацию в ваш код, во многих сценариях они могут помочь вам на самом деле сократить общий объем кода, который у вас есть. Следующий метод утраивает число, которое входит в переменную String. Обратите внимание на объем кода, который просто проверяет, действительно ли значение является ненулевым положительным целочисленным значением.

    public static String triple(final String value) {
try {
if (value != null) {
final int number = Integer.parseInt(value);
if (number<=0)
throw new IllegalArgumentException("The argument must contain a positive integer number");
return "" + number*3;
} else {
throw new IllegalArgumentException("Null values are not allowed");
}
} catch (NumberFormatException e) {
throw new IllegalArgumentException("The argument must contain a positive integer number");
}
}

Используя аннотации @NotNull и @Pattern, мы можем сократить приведенный выше метод до следующего:

    public static String triple(@NotNull @Pattern("[0-9]+") final String value) {
return "" + Integer.parseInt(value) *3;
}

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

интеграция

Annotations.jar файл , который поставляется со всеми распределениями IntelliJ IDEA содержит определение аннотации , которые мы рассмотрели. Пока вы храните файл в пути к классам проекта, ни сервер Continuous Integration, ни другие IDE не будут на них жаловаться. Однако в настоящее время только IntelliJ IDEA и TeamCity могут использовать аннотации для вашей полной выгоды.

Резюме

Теперь это на сегодня. Мы рассмотрели несколько стандартных аннотаций JSR-305, которые могут помочь механизму статического анализа кода найти больше ошибок в нашем коде.

Получайте удовольствие от поиска ошибок в вашем коде!