Developer Tales or everything about everything

17Дек/120

SuppressWarnings

Многие начинающие Java-разработчики рано или поздно встречаются с аннотациями и с далеко небезызвестной аннотацией @SuppressWarnings. Полезность этой аннотации в том, что она общепринята к использованию во всех IDE (Integrated Development Environment, такие как Eclipse, NetBeans или IntelliJ IDEA) и позволяет скрывать предупреждения компиляторов.

Предупреждения IDE

Интегрированные среды разработки довольно часто отображают не только ошибки, но и предупреждения, такие как: неявное преобразование типов, неиспользуемый код, неоптимизированный доступ, deprecated-объект и др.

Когда Вы точно уверены, что участок кода безопасен для выполнения, но среда разработки все равно показывает предупреждения, следует использовать аннотацию @SuppressWarnings.

Например, встретив такой код:

, большинство сред разработки в этом месте будут ругаться и отображать предупреждение "Unchecked Assignment", то есть - "Непроверенное/неявное присваивание".

Такой код в некоторых случаях может породить труднообнаружимые проблемы, поэтому IDE считает необходимым уведомить об этом разработчика.

Однако, часто бывает и так, что это предупреждение совсем не нужно - разработчик уверен в своих действиях и написанном коде. Тут на помощь приходит @SuppressWarnings. Если перепишем код из предыдущего примера так:

, то заметим, что предупреждение исчезнет. Здесь "unchecked" означает класс предупреждений, который необходимо отключить - "unchecked" как раз относится к неявному присвоению. Если заменить unchecked на другой класс, то предупреждение снова появится - нельзя заменить один класс другим (за исключением, может быть, класса "all", который работает не всегда).

Данную аннотацию можно применять на:

  1. Классы, интерфейсы, перечисления и аннотации;
  2. Поля классов;
  3. Методы классов;
  4. Параметры;
  5. Конструкторы;
  6. Локальные переменные.

В нашем примере под эффект аннотации попадает локальная переменная.

Следующий код даст абсолютно идентичный эффект, но, в добавок, скроет предупреждение о том, что метод method() не используется:

Замечу, что такая техника может работать от IDE к IDE, а в некоторых средах, вообще, работать не будет. Происходит так потому, что каждая конкретная IDE реализует обработку таких аннотаций по своему усмотрению.

Классы предупреждений

Существуют не только предупреждения о неявных присваиваниях - видов предупреждений гораздо больше, чем один.

В следующем списке указаны самые распространенные классы ошибок:

  1. all - игнорировать все предупреждения;
  2. boxing - игнорировать предупреждения, связанные с боксингом (оборачиванием примитивных типов (int, double, short и т.п.) в объектные типы (Integer, Double, Short и т.п.);
  3. cast - игнорировать предупреждения приведения типов;
  4. dep-ann - игнорировать предупреждения, связанные с использованием deprecated-аннотаций (аннотации подготовленные к удалению из библиотеки);
  5. deprecation - игнорировать использование deprecated-элементов (методы и поля подготовленные к удалению из библиотеки);
  6. fallthrough - игнорировать пропущенные операторы break в switch-блоках;
  7. finally - игнорировать finally-блоки, которые не используют return;
  8. hiding - игнорировать предупреждения о том, что локальная переменная скрывает другую переменную;
  9. incomplete-switch - игнорировать предупреждения о незавершенных switch-блоках (например, когда в таком блоке использованы не все элементы перечисления);
  10. nls - игнорировать предупреждения при обнаружении непереводимых символов (NLS String Literals);
  11. null - игнорировать предупреждения анализа NPE (Null Pointer Exception);
  12. rawtypes - игнорировать предупреждения, относящиеся к использованию нестандартных типов в шаблонах;
  13. restriction - игнорировать использования запрещенных объектов;
  14. serial - игнорировать отсутствие serialVersionUID для сериализуемых классов;
  15. static-access - игнорировать некорректный доступ к статическим переменным;
  16. synthetic-access -игнорировать неоптимизированный доступ к внутренним классам;
  17. unchecked - игнорировать неподтвержденные операции (неявные преобразования и т.п.);
  18. unqualified-field-access игнорировать неправомочный доступ к полям;
  19. unused - игнорировать предупреждения о коде, который не используется.

Просмотров: 4777