пятница, 6 июля 2012 г.

//noinspection в IntelliJ IDEA

Как я уже упоминал в предыдущем посте, в IDEA есть интересный плагин InspectionGadgets, который на текущее время предлагает более 500 дополнительных проверок для этой IDE и является мощным инструментом статического анализа кода.
Инспекции этого инструмента весьма удобны в использовании, т.к. сгруппированы по содержанию и назначению и могут настраиваться индивидуально. Более того, результаты настройки можно сохранить в отдельный файл xml формата и загрузить его в IDE в другом месте. Ну, да разговор немного о другом. InspectionGadgets отслеживает и формирует гораздо больше предупреждений, чем java компилятор. И если требуется подавить какое-то из предупреждений, то аннотация @SuppressWarnings отлично работает. Но как узнать название нужного предупреждения, чтобы указать его в параметрах аннотации?

Здесь List of SuppressWarnings arguments есть интересная статья с перечнем из 573-х инспекций и соответствующих им названий. К сожалению, со времени написания статьи сменилось уже несколько версий IDEA, поэтому весьма вероятны некоторые расхождения.

Также в IntelliJ IDEA имеется свой IDE-специфический синтаксис для подавления предупреждений в виде //noinspection name. В чём различие?
  • @SuppressWarnings("ThrowableInstanceNeverThrown") - может применяться для переменной, метода, класса целиком;
  • //noinspection ThrowableInstanceNeverThrown - только для конкретных строк кода (for just the statement).
Вот небольшой пример того, в каких случаях можно применять разные способы подавления предупреждений:
package by.father.examples.warnings;

import java.util.ArrayList;
import java.util.List;

@SuppressWarnings("unused")
public class NoInspectionsExample {

    @Deprecated
    public void someDeprecatedMethodWithUncheckedOperation () {
        List list = new ArrayList();
        //noinspection unchecked
        list.add("element");
        list.get(0).toString();
    }

    public void tryToUseDeprecatedMethod () {
        //noinspection deprecation
        someDeprecatedMethodWithUncheckedOperation();
    }

    @SuppressWarnings("MisspelledToString")
    public String tostring () {
        //noinspection StringConcatenation
        return "Concatenate this part " + " with this one.";
    }

}
Если мы попытаемся скомпилировать этот класс через javac в командной строке с опцией -Xlint:all, то обнаружим, что компилятор ничего не знает про //noinspection. Может оказаться полезным об этом помнить.
E:\warni\dev\examples\src\main\java\by\father\examples\warnings>javac -Xlint:all NoInspectionsExample.java
NoInspectionsExample.java:16: warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.List
        list.add("element");
                ^
1 warning

Комментариев нет:

Отправить комментарий